mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
libs/vkd3d: Factor out d3d12_root_signature_init_descriptor_pool_size().
This commit is contained in:
parent
17e49dc6c6
commit
9c2b126f38
@ -410,6 +410,80 @@ static HRESULT d3d12_root_signature_info_from_desc(struct d3d12_root_signature_i
|
||||
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,
|
||||
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info,
|
||||
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
|
||||
{
|
||||
/* Move used push constants ranges to front. */
|
||||
/* Move non-empty push constants ranges to front and compute offsets.
|
||||
*/
|
||||
offset = 0;
|
||||
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)
|
||||
continue;
|
||||
|
||||
/* FIXME: Register spaces should map to set layouts. */
|
||||
if (p->u.Constants.RegisterSpace)
|
||||
{
|
||||
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)))
|
||||
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
|
||||
* to preserve compatibility between Vulkan resource bindings for the same
|
||||
* root signature, we create descriptor set layouts with two bindings for
|
||||
* each SRV and UAV. */
|
||||
info.descriptor_count += info.srv_count + info.uav_count;
|
||||
|
||||
if (!(binding_desc = vkd3d_calloc(info.descriptor_count, sizeof(*binding_desc))))
|
||||
{
|
||||
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;
|
||||
}
|
||||
root_signature->descriptor_count = info.descriptor_count;
|
||||
if (!(root_signature->descriptor_mapping = vkd3d_calloc(root_signature->descriptor_count,
|
||||
sizeof(*root_signature->descriptor_mapping))))
|
||||
{
|
||||
hr = E_OUTOFMEMORY;
|
||||
goto fail;
|
||||
}
|
||||
root_signature->constant_count = info.root_constant_count;
|
||||
if (!(root_signature->push_constants = vkd3d_calloc(root_signature->constant_count,
|
||||
sizeof(*root_signature->push_constants))))
|
||||
{
|
||||
hr = E_OUTOFMEMORY;
|
||||
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,
|
||||
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_SRV:
|
||||
case D3D12_ROOT_PARAMETER_TYPE_UAV:
|
||||
/* FIXME: Register spaces should map to set layouts. */
|
||||
if (p->u.Descriptor.RegisterSpace)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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.pNext = NULL;
|
||||
pipeline_layout_info.flags = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user