vkd3d: Require bindless samplers and SRV/UAV/CBV.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-07-30 11:07:29 +02:00 committed by Hans-Kristian Arntzen
parent 029f1cec4f
commit 2cd23f5305
1 changed files with 28 additions and 35 deletions

View File

@ -3302,53 +3302,46 @@ static uint32_t vkd3d_bindless_state_get_bindless_flags(struct d3d12_device *dev
HRESULT vkd3d_bindless_state_init(struct vkd3d_bindless_state *bindless_state,
struct d3d12_device *device)
{
HRESULT hr;
const uint32_t required_flags = VKD3D_BINDLESS_SRV |
VKD3D_BINDLESS_UAV | VKD3D_BINDLESS_CBV | VKD3D_BINDLESS_SAMPLER;
HRESULT hr = E_FAIL;
memset(bindless_state, 0, sizeof(*bindless_state));
bindless_state->flags = vkd3d_bindless_state_get_bindless_flags(device);
if (!bindless_state->flags)
return S_OK;
if (bindless_state->flags & VKD3D_BINDLESS_SAMPLER)
if ((bindless_state->flags & required_flags) != required_flags)
{
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, VKD3D_SHADER_BINDING_FLAG_IMAGE)))
goto fail;
ERR("Insufficient descriptor indexing support.\n");
goto fail;
}
if (bindless_state->flags & VKD3D_BINDLESS_CBV)
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, VKD3D_SHADER_BINDING_FLAG_IMAGE)))
goto fail;
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_CBV, VKD3D_SHADER_BINDING_FLAG_BUFFER)))
goto fail;
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_BUFFER)) ||
FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_IMAGE)))
goto fail;
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_BUFFER)) ||
FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_IMAGE)))
goto fail;
if (!(bindless_state->flags & VKD3D_RAW_VA_UAV_COUNTER))
{
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_CBV, VKD3D_SHADER_BINDING_FLAG_BUFFER)))
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_COUNTER)))
goto fail;
}
if (bindless_state->flags & VKD3D_BINDLESS_SRV)
{
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_BUFFER)) ||
FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, VKD3D_SHADER_BINDING_FLAG_IMAGE)))
goto fail;
}
if (bindless_state->flags & VKD3D_BINDLESS_UAV)
{
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_BUFFER)) ||
FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_IMAGE)))
goto fail;
if (!(bindless_state->flags & VKD3D_RAW_VA_UAV_COUNTER))
{
if (FAILED(hr = vkd3d_bindless_state_add_binding(bindless_state, device,
D3D12_DESCRIPTOR_RANGE_TYPE_UAV, VKD3D_SHADER_BINDING_FLAG_COUNTER)))
goto fail;
}
}
return S_OK;
fail: