libs/vkd3d: Factor out d3d12_root_signature_init_descriptor_pool_size().

This commit is contained in:
Józef Kucia 2017-08-11 13:58:04 +02:00
parent 17e49dc6c6
commit 9c2b126f38

View File

@ -410,6 +410,80 @@ static HRESULT d3d12_root_signature_info_from_desc(struct d3d12_root_signature_i
return S_OK; return S_OK;
} }
static HRESULT d3d12_root_signature_init_descriptor_pool_size(struct d3d12_root_signature *root_signature,
const struct d3d12_root_signature_info *info)
{
unsigned int i;
root_signature->pool_size_count = 0;
if (info->cbv_count)
++root_signature->pool_size_count;
if (info->buffer_srv_count || info->srv_count)
++root_signature->pool_size_count;
if (info->srv_count)
++root_signature->pool_size_count;
if (info->buffer_uav_count || info->uav_count)
++root_signature->pool_size_count;
if (info->uav_count)
++root_signature->pool_size_count;
if (info->sampler_count)
++root_signature->pool_size_count;
if (root_signature->pool_size_count)
{
if (!(root_signature->pool_sizes = vkd3d_calloc(root_signature->pool_size_count,
sizeof(*root_signature->pool_sizes))))
{
return E_OUTOFMEMORY;
}
i = 0;
if (info->cbv_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
root_signature->pool_sizes[i++].descriptorCount = info->cbv_count;
}
/* Each D3D12_DESCRIPTOR_RANGE_TYPE_SRV descriptor can be either a
* buffer or a texture view. Allocate one buffer view and one image
* view Vulkan descriptor for each. */
if (info->buffer_srv_count || info->srv_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
root_signature->pool_sizes[i++].descriptorCount = info->buffer_srv_count + info->srv_count;
}
if (info->srv_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
root_signature->pool_sizes[i++].descriptorCount = info->srv_count;
}
/* Each D3D12_DESCRIPTOR_RANGE_TYPE_UAV descriptor can be either a
* buffer or a texture view. Allocate one buffer view and one image
* view Vulkan descriptor for each. */
if (info->buffer_uav_count || info->uav_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
root_signature->pool_sizes[i++].descriptorCount = info->buffer_uav_count + info->uav_count;
}
if (info->uav_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
root_signature->pool_sizes[i++].descriptorCount = info->uav_count;
}
if (info->sampler_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_SAMPLER;
root_signature->pool_sizes[i++].descriptorCount = info->sampler_count;
}
}
else
{
root_signature->pool_sizes = NULL;
root_signature->pool_size_count = 0;
}
return S_OK;
}
static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signature *root_signature, static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signature *root_signature,
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info, const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info,
struct VkPushConstantRange push_constants[D3D12_SHADER_VISIBILITY_PIXEL + 1], struct VkPushConstantRange push_constants[D3D12_SHADER_VISIBILITY_PIXEL + 1],
@ -451,7 +525,8 @@ static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signat
} }
else else
{ {
/* Move used push constants ranges to front. */ /* Move non-empty push constants ranges to front and compute offsets.
*/
offset = 0; offset = 0;
for (i = 0, j = 0; i <= D3D12_SHADER_VISIBILITY_PIXEL; ++i) for (i = 0, j = 0; i <= D3D12_SHADER_VISIBILITY_PIXEL; ++i)
{ {
@ -476,7 +551,6 @@ static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signat
if (p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS) if (p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS)
continue; continue;
/* FIXME: Register spaces should map to set layouts. */
if (p->u.Constants.RegisterSpace) if (p->u.Constants.RegisterSpace)
{ {
FIXME("Unhandled register space %u for parameter %u.\n", p->u.Constants.RegisterSpace, i); FIXME("Unhandled register space %u for parameter %u.\n", p->u.Constants.RegisterSpace, i);
@ -580,39 +654,34 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
if (FAILED(hr = d3d12_root_signature_info_from_desc(&info, desc))) if (FAILED(hr = d3d12_root_signature_info_from_desc(&info, desc)))
return hr; return hr;
root_signature->parameter_count = desc->NumParameters;
if (!(root_signature->parameters = vkd3d_calloc(root_signature->parameter_count,
sizeof(*root_signature->parameters))))
{
hr = E_OUTOFMEMORY;
goto fail;
}
/* XXX: Vulkan buffer and image descriptors have different types. In order /* XXX: Vulkan buffer and image descriptors have different types. In order
* to preserve compatibility between Vulkan resource bindings for the same * to preserve compatibility between Vulkan resource bindings for the same
* root signature, we create descriptor set layouts with two bindings for * root signature, we create descriptor set layouts with two bindings for
* each SRV and UAV. */ * each SRV and UAV. */
info.descriptor_count += info.srv_count + info.uav_count; info.descriptor_count += info.srv_count + info.uav_count;
if (!(binding_desc = vkd3d_calloc(info.descriptor_count, sizeof(*binding_desc))))
{
hr = E_OUTOFMEMORY; hr = E_OUTOFMEMORY;
root_signature->parameter_count = desc->NumParameters;
if (!(root_signature->parameters = vkd3d_calloc(root_signature->parameter_count,
sizeof(*root_signature->parameters))))
goto fail; goto fail;
}
root_signature->descriptor_count = info.descriptor_count; root_signature->descriptor_count = info.descriptor_count;
if (!(root_signature->descriptor_mapping = vkd3d_calloc(root_signature->descriptor_count, if (!(root_signature->descriptor_mapping = vkd3d_calloc(root_signature->descriptor_count,
sizeof(*root_signature->descriptor_mapping)))) sizeof(*root_signature->descriptor_mapping))))
{
hr = E_OUTOFMEMORY;
goto fail; goto fail;
}
root_signature->constant_count = info.root_constant_count; root_signature->constant_count = info.root_constant_count;
if (!(root_signature->push_constants = vkd3d_calloc(root_signature->constant_count, if (!(root_signature->push_constants = vkd3d_calloc(root_signature->constant_count,
sizeof(*root_signature->push_constants)))) sizeof(*root_signature->push_constants))))
{
hr = E_OUTOFMEMORY;
goto fail; goto fail;
} root_signature->static_sampler_count = desc->NumStaticSamplers;
if (!(root_signature->static_samplers = vkd3d_calloc(root_signature->static_sampler_count,
sizeof(*root_signature->static_samplers))))
goto fail;
if (!(binding_desc = vkd3d_calloc(info.descriptor_count, sizeof(*binding_desc))))
goto fail;
if (FAILED(hr = d3d12_root_signature_init_descriptor_pool_size(root_signature, &info)))
goto fail;
if (FAILED(hr = d3d12_root_signature_init_push_constants(root_signature, desc, &info, if (FAILED(hr = d3d12_root_signature_init_push_constants(root_signature, desc, &info,
push_constants, &push_constant_count))) push_constants, &push_constant_count)))
@ -691,7 +760,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
case D3D12_ROOT_PARAMETER_TYPE_CBV: case D3D12_ROOT_PARAMETER_TYPE_CBV:
case D3D12_ROOT_PARAMETER_TYPE_SRV: case D3D12_ROOT_PARAMETER_TYPE_SRV:
case D3D12_ROOT_PARAMETER_TYPE_UAV: case D3D12_ROOT_PARAMETER_TYPE_UAV:
/* FIXME: Register spaces should map to set layouts. */
if (p->u.Descriptor.RegisterSpace) if (p->u.Descriptor.RegisterSpace)
{ {
FIXME("Unhandled register space %u for parameter %u.\n", p->u.Descriptor.RegisterSpace, i); FIXME("Unhandled register space %u for parameter %u.\n", p->u.Descriptor.RegisterSpace, i);
@ -719,14 +787,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
} }
} }
root_signature->static_sampler_count = desc->NumStaticSamplers;
if (!(root_signature->static_samplers = vkd3d_calloc(root_signature->static_sampler_count,
sizeof(*root_signature->static_samplers))))
{
hr = E_OUTOFMEMORY;
goto fail;
}
for (i = 0; i < desc->NumStaticSamplers; ++i) for (i = 0; i < desc->NumStaticSamplers; ++i)
{ {
const D3D12_STATIC_SAMPLER_DESC *s = &desc->pStaticSamplers[i]; const D3D12_STATIC_SAMPLER_DESC *s = &desc->pStaticSamplers[i];
@ -762,72 +822,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
goto fail; goto fail;
} }
root_signature->pool_size_count = 0;
if (info.cbv_count)
++root_signature->pool_size_count;
if (info.buffer_srv_count || info.srv_count)
++root_signature->pool_size_count;
if (info.srv_count)
++root_signature->pool_size_count;
if (info.buffer_uav_count || info.uav_count)
++root_signature->pool_size_count;
if (info.uav_count)
++root_signature->pool_size_count;
if (info.sampler_count)
++root_signature->pool_size_count;
if (root_signature->pool_size_count)
{
if (!(root_signature->pool_sizes = vkd3d_calloc(root_signature->pool_size_count,
sizeof(*root_signature->pool_sizes))))
{
hr = E_OUTOFMEMORY;
goto fail;
}
i = 0;
if (info.cbv_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
root_signature->pool_sizes[i++].descriptorCount = info.cbv_count;
}
/* Each D3D12_DESCRIPTOR_RANGE_TYPE_SRV descriptor can be either a
* buffer or a texture view. Allocate one buffer view and one image
* view Vulkan descriptor for each. */
if (info.buffer_srv_count || info.srv_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
root_signature->pool_sizes[i++].descriptorCount = info.buffer_srv_count + info.srv_count;
}
if (info.srv_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
root_signature->pool_sizes[i++].descriptorCount = info.srv_count;
}
/* Each D3D12_DESCRIPTOR_RANGE_TYPE_UAV descriptor can be either a
* buffer or a texture view. Allocate one buffer view and one image
* view Vulkan descriptor for each. */
if (info.buffer_uav_count || info.uav_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
root_signature->pool_sizes[i++].descriptorCount = info.buffer_uav_count + info.uav_count;
}
if (info.uav_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
root_signature->pool_sizes[i++].descriptorCount = info.uav_count;
}
if (info.sampler_count)
{
root_signature->pool_sizes[i].type = VK_DESCRIPTOR_TYPE_SAMPLER;
root_signature->pool_sizes[i++].descriptorCount = info.sampler_count;
}
}
else
{
root_signature->pool_sizes = NULL;
root_signature->pool_size_count = 0;
}
pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
pipeline_layout_info.pNext = NULL; pipeline_layout_info.pNext = NULL;
pipeline_layout_info.flags = 0; pipeline_layout_info.flags = 0;