vkd3d: Convert Root Signatures to 1.1.

We will be able make use of the use STATIC vs VOLATILE flags.

Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
Hans-Kristian Arntzen 2021-03-09 10:04:32 +01:00
parent c409d0f30a
commit d758a6e296
3 changed files with 42 additions and 29 deletions

View File

@ -350,7 +350,7 @@ struct d3d12_root_signature_info
};
static HRESULT d3d12_root_signature_info_count_descriptors(struct d3d12_root_signature_info *info,
struct d3d12_device *device, const D3D12_DESCRIPTOR_RANGE *range)
struct d3d12_device *device, const D3D12_DESCRIPTOR_RANGE1 *range)
{
switch (range->RangeType)
{
@ -382,7 +382,7 @@ static HRESULT d3d12_root_signature_info_count_descriptors(struct d3d12_root_sig
}
static HRESULT d3d12_root_signature_info_from_desc(struct d3d12_root_signature_info *info,
struct d3d12_device *device, const D3D12_ROOT_SIGNATURE_DESC *desc)
struct d3d12_device *device, const D3D12_ROOT_SIGNATURE_DESC1 *desc)
{
bool local_root_signature;
unsigned int i, j;
@ -394,7 +394,7 @@ static HRESULT d3d12_root_signature_info_from_desc(struct d3d12_root_signature_i
for (i = 0; i < desc->NumParameters; ++i)
{
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
const D3D12_ROOT_PARAMETER1 *p = &desc->pParameters[i];
switch (p->ParameterType)
{
@ -462,13 +462,13 @@ static bool d3d12_root_signature_parameter_is_raw_va(struct d3d12_root_signature
static HRESULT d3d12_root_signature_init_shader_record_constants(
struct d3d12_root_signature *root_signature,
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info)
const D3D12_ROOT_SIGNATURE_DESC1 *desc, const struct d3d12_root_signature_info *info)
{
unsigned int i, j;
for (i = 0, j = 0; i < desc->NumParameters; ++i)
{
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
const D3D12_ROOT_PARAMETER1 *p = &desc->pParameters[i];
if (p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS)
continue;
@ -490,7 +490,7 @@ static HRESULT d3d12_root_signature_init_shader_record_constants(
}
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_DESC1 *desc, const struct d3d12_root_signature_info *info,
struct VkPushConstantRange *push_constant_range)
{
unsigned int i, j;
@ -503,7 +503,7 @@ static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signat
/* Put root descriptor VAs at the start to avoid alignment issues */
for (i = 0; i < desc->NumParameters; ++i)
{
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
const D3D12_ROOT_PARAMETER1 *p = &desc->pParameters[i];
if (d3d12_root_signature_parameter_is_raw_va(root_signature, p->ParameterType))
{
@ -515,7 +515,7 @@ static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signat
/* Append actual root constants */
for (i = 0, j = 0; i < desc->NumParameters; ++i)
{
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
const D3D12_ROOT_PARAMETER1 *p = &desc->pParameters[i];
if (p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS)
continue;
@ -545,7 +545,7 @@ static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signat
for (i = 0; i < desc->NumParameters; ++i)
{
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
const D3D12_ROOT_PARAMETER1 *p = &desc->pParameters[i];
if (p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
continue;
@ -586,7 +586,7 @@ static enum vkd3d_bindless_set_flag vkd3d_bindless_set_flag_from_descriptor_rang
}
static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_root_signature *root_signature,
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info,
const D3D12_ROOT_SIGNATURE_DESC1 *desc, const struct d3d12_root_signature_info *info,
struct vkd3d_descriptor_set_context *context)
{
struct vkd3d_bindless_state *bindless_state = &root_signature->device->bindless_state;
@ -600,7 +600,7 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
for (i = 0, t = 0; i < desc->NumParameters; ++i)
{
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
const D3D12_ROOT_PARAMETER1 *p = &desc->pParameters[i];
if (p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
continue;
@ -623,7 +623,7 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
for (j = 0; j < range_count; ++j)
{
const D3D12_DESCRIPTOR_RANGE *range = &p->DescriptorTable.pDescriptorRanges[j];
const D3D12_DESCRIPTOR_RANGE1 *range = &p->DescriptorTable.pDescriptorRanges[j];
enum vkd3d_bindless_set_flag range_flag = vkd3d_bindless_set_flag_from_descriptor_range_type(range->RangeType);
if (range->OffsetInDescriptorsFromTableStart != D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
@ -725,7 +725,7 @@ static void d3d12_root_signature_init_extra_bindings(struct d3d12_root_signature
static HRESULT d3d12_root_signature_init_shader_record_descriptors(
struct d3d12_root_signature *root_signature,
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info,
const D3D12_ROOT_SIGNATURE_DESC1 *desc, const struct d3d12_root_signature_info *info,
struct vkd3d_descriptor_set_context *context)
{
struct vkd3d_shader_resource_binding *binding;
@ -734,7 +734,7 @@ static HRESULT d3d12_root_signature_init_shader_record_descriptors(
for (i = 0; i < desc->NumParameters; ++i)
{
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
const D3D12_ROOT_PARAMETER1 *p = &desc->pParameters[i];
if (p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_CBV
&& p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_SRV
@ -763,7 +763,7 @@ static HRESULT d3d12_root_signature_init_shader_record_descriptors(
}
static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_signature *root_signature,
const D3D12_ROOT_SIGNATURE_DESC *desc, const struct d3d12_root_signature_info *info,
const D3D12_ROOT_SIGNATURE_DESC1 *desc, const struct d3d12_root_signature_info *info,
const VkPushConstantRange *push_constant_range, struct vkd3d_descriptor_set_context *context,
VkDescriptorSetLayout *vk_set_layout)
{
@ -787,7 +787,7 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
for (i = 0, j = 0; i < desc->NumParameters; ++i)
{
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
const D3D12_ROOT_PARAMETER1 *p = &desc->pParameters[i];
bool raw_va;
if (p->ParameterType != D3D12_ROOT_PARAMETER_TYPE_CBV
@ -866,7 +866,7 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
}
static HRESULT d3d12_root_signature_init_static_samplers(struct d3d12_root_signature *root_signature,
const D3D12_ROOT_SIGNATURE_DESC *desc, struct vkd3d_descriptor_set_context *context,
const D3D12_ROOT_SIGNATURE_DESC1 *desc, struct vkd3d_descriptor_set_context *context,
VkDescriptorSetLayout *vk_set_layout)
{
VkDescriptorSetLayoutBinding *vk_binding_info, *vk_binding;
@ -925,7 +925,7 @@ cleanup:
}
static HRESULT d3d12_root_signature_init_local(struct d3d12_root_signature *root_signature,
struct d3d12_device *device, const D3D12_ROOT_SIGNATURE_DESC *desc)
struct d3d12_device *device, const D3D12_ROOT_SIGNATURE_DESC1 *desc)
{
/* Local root signatures map to the ShaderRecordBufferKHR. */
struct vkd3d_descriptor_set_context context;
@ -987,7 +987,7 @@ fail:
}
static HRESULT d3d12_root_signature_init_global(struct d3d12_root_signature *root_signature,
struct d3d12_device *device, const D3D12_ROOT_SIGNATURE_DESC *desc)
struct d3d12_device *device, const D3D12_ROOT_SIGNATURE_DESC1 *desc)
{
const VkPhysicalDeviceProperties *vk_device_properties = &device->device_info.properties2.properties;
const struct vkd3d_bindless_state *bindless_state = &device->bindless_state;
@ -1129,7 +1129,7 @@ static HRESULT d3d12_root_signature_init_global(struct d3d12_root_signature *roo
}
static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signature,
struct d3d12_device *device, const D3D12_ROOT_SIGNATURE_DESC *desc)
struct d3d12_device *device, const D3D12_ROOT_SIGNATURE_DESC1 *desc)
{
HRESULT hr;
@ -1175,7 +1175,7 @@ HRESULT d3d12_root_signature_create(struct d3d12_device *device,
HRESULT hr;
int ret;
if ((ret = vkd3d_parse_root_signature_v_1_0(&dxbc, &root_signature_desc.vkd3d)) < 0)
if ((ret = vkd3d_parse_root_signature_v_1_1(&dxbc, &root_signature_desc.vkd3d)) < 0)
{
WARN("Failed to parse root signature, vkd3d result %d.\n", ret);
return hresult_from_vkd3d_result(ret);
@ -1187,7 +1187,7 @@ HRESULT d3d12_root_signature_create(struct d3d12_device *device,
return E_OUTOFMEMORY;
}
hr = d3d12_root_signature_init(object, device, &root_signature_desc.d3d12.Desc_1_0);
hr = d3d12_root_signature_init(object, device, &root_signature_desc.d3d12.Desc_1_1);
vkd3d_shader_free_root_signature(&root_signature_desc.vkd3d);
if (FAILED(hr))
{

View File

@ -168,8 +168,9 @@ static CONST_VTBL struct ID3D12RootSignatureDeserializerVtbl d3d12_root_signatur
d3d12_root_signature_deserializer_GetRootSignatureDesc,
};
int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc,
struct vkd3d_versioned_root_signature_desc *out_desc)
static int vkd3d_parse_root_signature_for_version(const struct vkd3d_shader_code *dxbc,
struct vkd3d_versioned_root_signature_desc *out_desc,
enum vkd3d_root_signature_version target_version)
{
struct vkd3d_versioned_root_signature_desc desc, converted_desc;
int ret;
@ -180,19 +181,17 @@ int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc,
return ret;
}
if (desc.version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
if (desc.version == target_version)
{
*out_desc = desc;
}
else
{
enum vkd3d_root_signature_version version = desc.version;
ret = vkd3d_shader_convert_root_signature(&converted_desc, VKD3D_ROOT_SIGNATURE_VERSION_1_0, &desc);
ret = vkd3d_shader_convert_root_signature(&converted_desc, target_version, &desc);
vkd3d_shader_free_root_signature(&desc);
if (ret < 0)
{
WARN("Failed to convert from version %#x, vkd3d result %d.\n", version, ret);
WARN("Failed to convert from version %#x, vkd3d result %d.\n", desc.version, ret);
return ret;
}
@ -202,6 +201,18 @@ int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc,
return ret;
}
int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc,
struct vkd3d_versioned_root_signature_desc *out_desc)
{
return vkd3d_parse_root_signature_for_version(dxbc, out_desc, VKD3D_ROOT_SIGNATURE_VERSION_1_0);
}
int vkd3d_parse_root_signature_v_1_1(const struct vkd3d_shader_code *dxbc,
struct vkd3d_versioned_root_signature_desc *out_desc)
{
return vkd3d_parse_root_signature_for_version(dxbc, out_desc, VKD3D_ROOT_SIGNATURE_VERSION_1_1);
}
static HRESULT d3d12_root_signature_deserializer_init(struct d3d12_root_signature_deserializer *deserializer,
const struct vkd3d_shader_code *dxbc)
{

View File

@ -1198,6 +1198,8 @@ unsigned int d3d12_root_signature_get_shader_interface_flags(const struct d3d12_
int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc,
struct vkd3d_versioned_root_signature_desc *desc);
int vkd3d_parse_root_signature_v_1_1(const struct vkd3d_shader_code *dxbc,
struct vkd3d_versioned_root_signature_desc *desc);
#define VKD3D_MAX_DYNAMIC_STATE_COUNT (7)