Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • wine/vkd3d
  • stefan/vkd3d
  • cmccarthy/vkd3d
  • giomasce/vkd3d
  • fcasas/vkd3d
  • jactry/vkd3d
  • ReDress/vkd3d
  • mstorsjo/vkd3d
  • huw/vkd3d
  • julliard/vkd3d
  • bshanks/vkd3d
  • zfigura/vkd3d
  • hverbeet/vkd3d
  • DarkShadow44/vkd3d
  • nsivov/vkd3d
  • dhary686/vkd3d
  • Mystral/vkd3d
  • maljaf/vkd3d
  • smcv/vkd3d
  • flibitijibibo/vkd3d
  • q4a/vkd3d
  • jsikorski/vkd3d
  • alesliehughes/vkd3d-alesliehughes
  • vitorhnn/vkd3d
  • agusev/vkd3d
  • etang-cw/vkd3d
  • petrathekat/vkd3d
  • simon.mr995/vkd3d
  • sgwaki/vkd3d
  • jacek/vkd3d
  • fweimer/vkd3d
  • Clara/vkd3d
  • disini/vkd3d
  • antenabr2/vkd3d
  • gilvbp/vkd3d
  • yshui/vkd3d
  • shaunren/vkd3d
  • jennetsaryyewa96/vkd3d
  • Jamesattay/vkd3d
  • zacemmneeto77/vkd3d
  • GermanAizek/vkd3d
  • opespinach/vkd3d
  • ruslanboyka201/vkd3d
  • navi/vkd3d
  • Feifan/vkd3d
  • yashmhmdly172/vkd3d
  • Sec32fun32/vkd3d
  • ritalat/vkd3d
  • ivyl/vkd3d
  • baikaishiuc/vkd3d
  • austin987/vkd3d
  • TornadoCookie/vkd3d
52 results
Show changes
Commits on Source (12)
......@@ -7330,6 +7330,11 @@ static void vsir_validate_io_register(struct validation_context *ctx,
reg->idx_count, reg->type);
return;
}
if (is_array && !reg->idx[0].rel_addr && reg->idx[0].offset >= element->register_count)
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_INDEX,
"Array index %u exceeds the signature element register count %u in a register of type %#x.",
reg->idx[0].offset, element->register_count, reg->type);
}
if (has_control_point && !reg->idx[control_point_index].rel_addr
......@@ -7642,8 +7647,26 @@ static void vsir_validate_register(struct validation_context *ctx,
for (i = 0; i < min(reg->idx_count, ARRAY_SIZE(reg->idx)); ++i)
{
const struct vkd3d_shader_src_param *param = reg->idx[i].rel_addr;
if (reg->idx[i].rel_addr)
if (param)
{
vsir_validate_src_param(ctx, param);
switch (param->reg.type)
{
case VKD3DSPR_TEMP:
case VKD3DSPR_SSA:
case VKD3DSPR_ADDR:
case VKD3DSPR_LOOP:
case VKD3DSPR_OUTPOINTID:
break;
default:
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_REGISTER_TYPE,
"Invalid register type %#x for a relative address parameter.",
param->reg.type);
break;
}
}
}
switch (reg->type)
......
This diff is collapsed.
......@@ -1473,16 +1473,21 @@ static void vkd3d_device_vk_heaps_descriptor_limits_init(struct vkd3d_device_des
uav_divisor = properties->maxDescriptorSetUpdateAfterBindSampledImages >= (3u << 20) ? 3 : 2;
}
limits->uniform_buffer_max_descriptors = min(properties->maxDescriptorSetUpdateAfterBindUniformBuffers,
properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers - root_provision);
limits->sampled_image_max_descriptors = min(properties->maxDescriptorSetUpdateAfterBindSampledImages,
properties->maxPerStageDescriptorUpdateAfterBindSampledImages / srv_divisor - root_provision);
limits->storage_buffer_max_descriptors = min(properties->maxDescriptorSetUpdateAfterBindStorageBuffers,
properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers - root_provision);
limits->storage_image_max_descriptors = min(properties->maxDescriptorSetUpdateAfterBindStorageImages,
properties->maxPerStageDescriptorUpdateAfterBindStorageImages / uav_divisor - root_provision);
limits->sampler_max_descriptors = min(properties->maxDescriptorSetUpdateAfterBindSamplers,
properties->maxPerStageDescriptorUpdateAfterBindSamplers - root_provision);
limits->uniform_buffer_max_descriptors = min(min(properties->maxDescriptorSetUpdateAfterBindUniformBuffers,
properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers - root_provision),
VKD3D_MAX_DESCRIPTOR_SET_CBVS_SRVS_UAVS);
limits->sampled_image_max_descriptors = min(min(properties->maxDescriptorSetUpdateAfterBindSampledImages,
properties->maxPerStageDescriptorUpdateAfterBindSampledImages / srv_divisor - root_provision),
VKD3D_MAX_DESCRIPTOR_SET_CBVS_SRVS_UAVS);
limits->storage_buffer_max_descriptors = min(min(properties->maxDescriptorSetUpdateAfterBindStorageBuffers,
properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers - root_provision),
VKD3D_MAX_DESCRIPTOR_SET_CBVS_SRVS_UAVS);
limits->storage_image_max_descriptors = min(min(properties->maxDescriptorSetUpdateAfterBindStorageImages,
properties->maxPerStageDescriptorUpdateAfterBindStorageImages / uav_divisor - root_provision),
VKD3D_MAX_DESCRIPTOR_SET_CBVS_SRVS_UAVS);
limits->sampler_max_descriptors = min(min(properties->maxDescriptorSetUpdateAfterBindSamplers,
properties->maxPerStageDescriptorUpdateAfterBindSamplers - root_provision),
VKD3D_MAX_DESCRIPTOR_SET_CBVS_SRVS_UAVS);
limits->sampler_max_descriptors = min(limits->sampler_max_descriptors, VKD3D_MAX_DESCRIPTOR_SET_SAMPLERS);
}
......@@ -2677,39 +2682,16 @@ static void vkd3d_time_domains_init(struct d3d12_device *device)
static void device_init_descriptor_pool_sizes(struct d3d12_device *device)
{
const struct vkd3d_device_descriptor_limits *limits = &device->vk_info.descriptor_limits;
VkDescriptorPoolSize *pool_sizes = device->vk_pool_sizes;
unsigned int *pool_sizes = device->vk_pool_limits;
if (device->use_vk_heaps)
{
pool_sizes[0].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
pool_sizes[0].descriptorCount = min(limits->storage_image_max_descriptors,
VKD3D_MAX_UAV_CLEAR_DESCRIPTORS_PER_TYPE);
pool_sizes[1].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
pool_sizes[1].descriptorCount = pool_sizes[0].descriptorCount;
pool_sizes[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
pool_sizes[2].descriptorCount = min(limits->sampler_max_descriptors, D3D12_MAX_LIVE_STATIC_SAMPLERS);
device->vk_pool_count = 3;
return;
}
VKD3D_ASSERT(ARRAY_SIZE(device->vk_pool_sizes) >= 6);
pool_sizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
pool_sizes[0].descriptorCount = min(limits->uniform_buffer_max_descriptors,
pool_sizes[VKD3D_SHADER_DESCRIPTOR_TYPE_CBV] = min(limits->uniform_buffer_max_descriptors,
VKD3D_MAX_VIRTUAL_HEAP_DESCRIPTORS_PER_TYPE);
pool_sizes[1].type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
pool_sizes[1].descriptorCount = min(limits->sampled_image_max_descriptors,
pool_sizes[VKD3D_SHADER_DESCRIPTOR_TYPE_SRV] = min(limits->sampled_image_max_descriptors,
VKD3D_MAX_VIRTUAL_HEAP_DESCRIPTORS_PER_TYPE);
pool_sizes[2].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
pool_sizes[2].descriptorCount = pool_sizes[1].descriptorCount;
pool_sizes[3].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
pool_sizes[3].descriptorCount = min(limits->storage_image_max_descriptors,
pool_sizes[VKD3D_SHADER_DESCRIPTOR_TYPE_UAV] = min(limits->storage_image_max_descriptors,
VKD3D_MAX_VIRTUAL_HEAP_DESCRIPTORS_PER_TYPE);
pool_sizes[4].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
pool_sizes[4].descriptorCount = pool_sizes[3].descriptorCount;
pool_sizes[5].type = VK_DESCRIPTOR_TYPE_SAMPLER;
pool_sizes[5].descriptorCount = min(limits->sampler_max_descriptors,
pool_sizes[VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER] = min(limits->sampler_max_descriptors,
VKD3D_MAX_VIRTUAL_HEAP_DESCRIPTORS_PER_TYPE);
device->vk_pool_count = 6;
};
static void vkd3d_desc_object_cache_init(struct vkd3d_desc_object_cache *cache, size_t size)
......
......@@ -265,25 +265,6 @@ static enum vkd3d_shader_visibility vkd3d_shader_visibility_from_d3d12(D3D12_SHA
}
}
static VkDescriptorType vk_descriptor_type_from_vkd3d_descriptor_type(enum vkd3d_shader_descriptor_type type,
bool is_buffer)
{
switch (type)
{
case VKD3D_SHADER_DESCRIPTOR_TYPE_SRV:
return is_buffer ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
case VKD3D_SHADER_DESCRIPTOR_TYPE_UAV:
return is_buffer ? VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
case VKD3D_SHADER_DESCRIPTOR_TYPE_CBV:
return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
case VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER:
return VK_DESCRIPTOR_TYPE_SAMPLER;
default:
FIXME("Unhandled descriptor range type type %#x.\n", type);
return VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
}
}
static enum vkd3d_shader_descriptor_type vkd3d_descriptor_type_from_d3d12_range_type(
D3D12_DESCRIPTOR_RANGE_TYPE type)
{
......@@ -717,6 +698,8 @@ struct vk_binding_array
VkDescriptorSetLayoutBinding *bindings;
size_t capacity, count;
enum vkd3d_shader_descriptor_type descriptor_type;
unsigned int descriptor_set;
unsigned int table_index;
unsigned int unbounded_offset;
VkDescriptorSetLayoutCreateFlags flags;
......@@ -754,14 +737,24 @@ static bool vk_binding_array_add_binding(struct vk_binding_array *array,
return true;
}
static void vk_binding_array_make_unbound(struct vk_binding_array *array,
unsigned int offset, unsigned int table_index)
{
array->unbounded_offset = offset;
array->table_index = table_index;
}
struct vkd3d_descriptor_set_context
{
struct vk_binding_array vk_bindings[VKD3D_MAX_DESCRIPTOR_SETS];
struct vk_binding_array *current_binding_array[VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT];
unsigned int table_index;
unsigned int unbounded_offset;
unsigned int descriptor_index;
unsigned int uav_counter_index;
unsigned int push_constant_index;
struct vk_binding_array *push_descriptor_set;
bool push_descriptor;
};
static void descriptor_set_context_cleanup(struct vkd3d_descriptor_set_context *context)
......@@ -786,46 +779,66 @@ static bool vkd3d_validate_descriptor_set_count(struct d3d12_device *device, uns
return true;
}
static struct vk_binding_array *d3d12_root_signature_current_vk_binding_array(
struct d3d12_root_signature *root_signature, struct vkd3d_descriptor_set_context *context)
static struct vk_binding_array *d3d12_root_signature_append_vk_binding_array(
struct d3d12_root_signature *root_signature, enum vkd3d_shader_descriptor_type descriptor_type,
VkDescriptorSetLayoutCreateFlags flags, struct vkd3d_descriptor_set_context *context)
{
struct vk_binding_array *array;
unsigned int set;
if (root_signature->vk_set_count >= ARRAY_SIZE(context->vk_bindings))
return NULL;
return &context->vk_bindings[root_signature->vk_set_count];
set = root_signature->vk_set_count++;
array = &context->vk_bindings[set];
array->descriptor_type = descriptor_type;
array->descriptor_set = set;
array->unbounded_offset = UINT_MAX;
array->flags = flags;
return array;
}
static void d3d12_root_signature_append_vk_binding_array(struct d3d12_root_signature *root_signature,
VkDescriptorSetLayoutCreateFlags flags, struct vkd3d_descriptor_set_context *context)
static struct vk_binding_array *d3d12_root_signature_vk_binding_array_for_type(
struct d3d12_root_signature *root_signature, enum vkd3d_shader_descriptor_type descriptor_type,
struct vkd3d_descriptor_set_context *context)
{
struct vk_binding_array *array;
struct vk_binding_array *array, **current;
if (!(array = d3d12_root_signature_current_vk_binding_array(root_signature, context)) || !array->count)
return;
if (context->push_descriptor)
{
if (!context->push_descriptor_set)
context->push_descriptor_set = d3d12_root_signature_append_vk_binding_array(root_signature,
descriptor_type, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, context);
array->table_index = context->table_index;
array->unbounded_offset = context->unbounded_offset;
array->flags = flags;
return context->push_descriptor_set;
}
++root_signature->vk_set_count;
current = context->current_binding_array;
if (!(array = current[descriptor_type]))
{
array = d3d12_root_signature_append_vk_binding_array(root_signature, descriptor_type, 0, context);
current[descriptor_type] = array;
}
return array;
}
static HRESULT d3d12_root_signature_append_vk_binding(struct d3d12_root_signature *root_signature,
enum vkd3d_shader_descriptor_type descriptor_type, unsigned int register_space,
unsigned int register_idx, bool buffer_descriptor, enum vkd3d_shader_visibility shader_visibility,
unsigned int descriptor_count, struct vkd3d_descriptor_set_context *context,
const VkSampler *immutable_sampler, unsigned int *binding_idx)
struct vk_binding_array *array, enum vkd3d_shader_descriptor_type descriptor_type,
unsigned int register_space, unsigned int register_idx, bool buffer_descriptor,
enum vkd3d_shader_visibility shader_visibility, unsigned int descriptor_count,
struct vkd3d_descriptor_set_context *context, const VkSampler *immutable_sampler)
{
struct vkd3d_shader_descriptor_offset *offset = root_signature->descriptor_offsets
? &root_signature->descriptor_offsets[context->descriptor_index] : NULL;
struct vkd3d_shader_resource_binding *mapping;
struct vk_binding_array *array;
VkDescriptorType vk_descriptor_type;
unsigned int idx;
if (!(array = d3d12_root_signature_current_vk_binding_array(root_signature, context))
|| !(vk_binding_array_add_binding(&context->vk_bindings[root_signature->vk_set_count],
vk_descriptor_type_from_vkd3d_descriptor_type(descriptor_type, buffer_descriptor), descriptor_count,
stage_flags_from_vkd3d_shader_visibility(shader_visibility), immutable_sampler, &idx)))
vk_descriptor_type = vk_descriptor_type_from_vkd3d_descriptor_type(descriptor_type, buffer_descriptor);
if (!vk_binding_array_add_binding(array, vk_descriptor_type, descriptor_count,
stage_flags_from_vkd3d_shader_visibility(shader_visibility), immutable_sampler, &idx))
return E_OUTOFMEMORY;
mapping = &root_signature->descriptor_mapping[context->descriptor_index++];
......@@ -834,7 +847,7 @@ static HRESULT d3d12_root_signature_append_vk_binding(struct d3d12_root_signatur
mapping->register_index = register_idx;
mapping->shader_visibility = shader_visibility;
mapping->flags = buffer_descriptor ? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
mapping->binding.set = root_signature->vk_set_count;
mapping->binding.set = array->descriptor_set;
mapping->binding.binding = idx;
mapping->binding.count = descriptor_count;
if (offset)
......@@ -843,12 +856,6 @@ static HRESULT d3d12_root_signature_append_vk_binding(struct d3d12_root_signatur
offset->dynamic_offset_index = ~0u;
}
if (context->unbounded_offset != UINT_MAX)
d3d12_root_signature_append_vk_binding_array(root_signature, 0, context);
if (binding_idx)
*binding_idx = idx;
return S_OK;
}
......@@ -911,7 +918,7 @@ static unsigned int vk_binding_count_from_descriptor_range(const struct d3d12_ro
}
static HRESULT d3d12_root_signature_init_descriptor_table_binding(struct d3d12_root_signature *root_signature,
const struct d3d12_root_descriptor_table_range *range, D3D12_SHADER_VISIBILITY visibility,
struct d3d12_root_descriptor_table_range *range, D3D12_SHADER_VISIBILITY visibility,
unsigned int vk_binding_array_count, unsigned int bindings_per_range,
struct vkd3d_descriptor_set_context *context)
{
......@@ -919,34 +926,49 @@ static HRESULT d3d12_root_signature_init_descriptor_table_binding(struct d3d12_r
bool is_buffer = range->type != VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER;
enum vkd3d_shader_descriptor_type descriptor_type = range->type;
unsigned int i, register_space = range->register_space;
struct vk_binding_array *array;
HRESULT hr;
if (range->descriptor_count == UINT_MAX)
context->unbounded_offset = range->offset;
if (!(array = d3d12_root_signature_vk_binding_array_for_type(root_signature, descriptor_type, context)))
return E_OUTOFMEMORY;
range->set = array->descriptor_set - root_signature->main_set;
range->binding = array->count;
for (i = 0; i < bindings_per_range; ++i)
{
if (FAILED(hr = d3d12_root_signature_append_vk_binding(root_signature, descriptor_type,
if (FAILED(hr = d3d12_root_signature_append_vk_binding(root_signature, array, descriptor_type,
register_space, range->base_register_idx + i, is_buffer, shader_visibility,
vk_binding_array_count, context, NULL, NULL)))
vk_binding_array_count, context, NULL)))
return hr;
}
if (descriptor_type != VKD3D_SHADER_DESCRIPTOR_TYPE_SRV && descriptor_type != VKD3D_SHADER_DESCRIPTOR_TYPE_UAV)
if (range->descriptor_count == UINT_MAX)
{
context->unbounded_offset = UINT_MAX;
return S_OK;
vk_binding_array_make_unbound(array, range->offset, context->table_index);
context->current_binding_array[descriptor_type] = NULL;
}
if (descriptor_type != VKD3D_SHADER_DESCRIPTOR_TYPE_SRV && descriptor_type != VKD3D_SHADER_DESCRIPTOR_TYPE_UAV)
return S_OK;
if (!(array = d3d12_root_signature_vk_binding_array_for_type(root_signature, descriptor_type, context)))
return E_OUTOFMEMORY;
range->image_set = array->descriptor_set - root_signature->main_set;
range->image_binding = array->count;
for (i = 0; i < bindings_per_range; ++i)
{
if (FAILED(hr = d3d12_root_signature_append_vk_binding(root_signature, descriptor_type,
if (FAILED(hr = d3d12_root_signature_append_vk_binding(root_signature, array, descriptor_type,
register_space, range->base_register_idx + i, false, shader_visibility,
vk_binding_array_count, context, NULL, NULL)))
vk_binding_array_count, context, NULL)))
return hr;
}
context->unbounded_offset = UINT_MAX;
if (range->descriptor_count == UINT_MAX)
{
vk_binding_array_make_unbound(array, range->offset, context->table_index);
context->current_binding_array[descriptor_type] = NULL;
}
return S_OK;
}
......@@ -1199,16 +1221,16 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
if (use_vk_heaps)
{
/* set, binding and vk_binding_count are not used. */
/* set, binding, image_set, image_binding, and vk_binding_count are not used. */
range->set = 0;
range->binding = 0;
range->image_set = 0;
range->image_binding = 0;
range->vk_binding_count = 0;
d3d12_root_signature_map_descriptor_heap_binding(root_signature, range, shader_visibility, context);
continue;
}
range->set = root_signature->vk_set_count - root_signature->main_set;
if (root_signature->use_descriptor_arrays)
{
if (j && range->type != table->ranges[j - 1].type)
......@@ -1229,6 +1251,8 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
range->set = base_range->set;
range->binding = base_range->binding;
range->image_set = base_range->image_set;
range->image_binding = base_range->image_binding;
range->vk_binding_count = base_range->vk_binding_count - rel_offset;
d3d12_root_signature_map_descriptor_unbounded_binding(root_signature, range,
rel_offset, shader_visibility, context);
......@@ -1251,8 +1275,6 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
bindings_per_range = range->descriptor_count;
}
range->binding = context->vk_bindings[root_signature->vk_set_count].count;
if (FAILED(hr = d3d12_root_signature_init_descriptor_table_binding(root_signature, range,
p->ShaderVisibility, vk_binding_array_count, bindings_per_range, context)))
return hr;
......@@ -1266,7 +1288,9 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_signature *root_signature,
const D3D12_ROOT_SIGNATURE_DESC *desc, struct vkd3d_descriptor_set_context *context)
{
unsigned int binding, i;
enum vkd3d_shader_descriptor_type descriptor_type;
struct vk_binding_array *array;
unsigned int i;
HRESULT hr;
root_signature->push_descriptor_mask = 0;
......@@ -1281,14 +1305,19 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
root_signature->push_descriptor_mask |= 1u << i;
if (FAILED(hr = d3d12_root_signature_append_vk_binding(root_signature,
vkd3d_descriptor_type_from_d3d12_root_parameter_type(p->ParameterType),
descriptor_type = vkd3d_descriptor_type_from_d3d12_root_parameter_type(p->ParameterType);
if (!(array = d3d12_root_signature_vk_binding_array_for_type(root_signature, descriptor_type, context)))
return E_OUTOFMEMORY;
root_signature->parameters[i].parameter_type = p->ParameterType;
root_signature->parameters[i].u.descriptor.set = array->descriptor_set;
root_signature->parameters[i].u.descriptor.binding = array->count;
if (FAILED(hr = d3d12_root_signature_append_vk_binding(root_signature, array, descriptor_type,
p->u.Descriptor.RegisterSpace, p->u.Descriptor.ShaderRegister, true,
vkd3d_shader_visibility_from_d3d12(p->ShaderVisibility), 1, context, NULL, &binding)))
vkd3d_shader_visibility_from_d3d12(p->ShaderVisibility), 1, context, NULL)))
return hr;
root_signature->parameters[i].parameter_type = p->ParameterType;
root_signature->parameters[i].u.descriptor.binding = binding;
}
return S_OK;
......@@ -1298,10 +1327,19 @@ static HRESULT d3d12_root_signature_init_static_samplers(struct d3d12_root_signa
struct d3d12_device *device, const D3D12_ROOT_SIGNATURE_DESC *desc,
struct vkd3d_descriptor_set_context *context)
{
struct vk_binding_array *array;
unsigned int i;
HRESULT hr;
VKD3D_ASSERT(root_signature->static_sampler_count == desc->NumStaticSamplers);
if (!desc->NumStaticSamplers)
return S_OK;
if (!(array = d3d12_root_signature_vk_binding_array_for_type(root_signature,
VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, context)))
return E_OUTOFMEMORY;
for (i = 0; i < desc->NumStaticSamplers; ++i)
{
const D3D12_STATIC_SAMPLER_DESC *s = &desc->pStaticSamplers[i];
......@@ -1309,16 +1347,13 @@ static HRESULT d3d12_root_signature_init_static_samplers(struct d3d12_root_signa
if (FAILED(hr = vkd3d_create_static_sampler(device, s, &root_signature->static_samplers[i])))
return hr;
if (FAILED(hr = d3d12_root_signature_append_vk_binding(root_signature,
if (FAILED(hr = d3d12_root_signature_append_vk_binding(root_signature, array,
VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, s->RegisterSpace, s->ShaderRegister, false,
vkd3d_shader_visibility_from_d3d12(s->ShaderVisibility), 1, context,
&root_signature->static_samplers[i], NULL)))
&root_signature->static_samplers[i])))
return hr;
}
if (device->use_vk_heaps)
d3d12_root_signature_append_vk_binding_array(root_signature, 0, context);
return S_OK;
}
......@@ -1450,29 +1485,52 @@ static HRESULT vkd3d_create_pipeline_layout(struct d3d12_device *device,
return S_OK;
}
static HRESULT d3d12_descriptor_set_layout_init(struct d3d12_descriptor_set_layout *layout,
struct d3d12_device *device, const struct vk_binding_array *array)
{
unsigned int descriptor_count;
bool unbounded;
HRESULT hr;
size_t i;
descriptor_count = array->unbounded_offset;
if (!(unbounded = descriptor_count != UINT_MAX))
{
for (i = 0, descriptor_count = 0; i < array->count; ++i)
{
descriptor_count += array->bindings[i].descriptorCount;
}
}
if (FAILED(hr = vkd3d_create_descriptor_set_layout(device, array->flags,
array->count, unbounded, array->bindings, &layout->vk_layout)))
return hr;
layout->descriptor_type = array->descriptor_type;
layout->descriptor_count = descriptor_count;
layout->unbounded_offset = array->unbounded_offset;
layout->table_index = array->table_index;
return S_OK;
}
static HRESULT d3d12_root_signature_create_descriptor_set_layouts(struct d3d12_root_signature *root_signature,
struct vkd3d_descriptor_set_context *context)
{
unsigned int i;
HRESULT hr;
d3d12_root_signature_append_vk_binding_array(root_signature, 0, context);
if (!vkd3d_validate_descriptor_set_count(root_signature->device, root_signature->vk_set_count))
return E_INVALIDARG;
for (i = 0; i < root_signature->vk_set_count; ++i)
{
struct d3d12_descriptor_set_layout *layout = &root_signature->descriptor_set_layouts[i];
struct vk_binding_array *array = &context->vk_bindings[i];
const struct vk_binding_array *array = &context->vk_bindings[i];
VKD3D_ASSERT(array->count);
if (FAILED(hr = vkd3d_create_descriptor_set_layout(root_signature->device, array->flags, array->count,
array->unbounded_offset != UINT_MAX, array->bindings, &layout->vk_layout)))
if (FAILED(hr = d3d12_descriptor_set_layout_init(&root_signature->descriptor_set_layouts[i],
root_signature->device, array)))
return hr;
layout->unbounded_offset = array->unbounded_offset;
layout->table_index = array->table_index;
}
return S_OK;
......@@ -1518,7 +1576,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
HRESULT hr;
memset(&context, 0, sizeof(context));
context.unbounded_offset = UINT_MAX;
root_signature->ID3D12RootSignature_iface.lpVtbl = &d3d12_root_signature_vtbl;
root_signature->refcount = 1;
......@@ -1580,17 +1637,11 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
sizeof(*root_signature->static_samplers))))
goto fail;
context.push_descriptor = vk_info->KHR_push_descriptor;
if (FAILED(hr = d3d12_root_signature_init_root_descriptors(root_signature, desc, &context)))
goto fail;
/* We use KHR_push_descriptor for root descriptor parameters. */
if (vk_info->KHR_push_descriptor)
{
d3d12_root_signature_append_vk_binding_array(root_signature,
VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, &context);
}
root_signature->main_set = root_signature->vk_set_count;
root_signature->main_set = !!context.push_descriptor_set;
context.push_descriptor = false;
if (FAILED(hr = d3d12_root_signature_init_push_constants(root_signature, desc,
root_signature->push_constant_ranges, &root_signature->push_constant_range_count)))
......
......@@ -58,12 +58,17 @@
#define VKD3D_MAX_VK_SYNC_OBJECTS 4u
#define VKD3D_MAX_DEVICE_BLOCKED_QUEUES 16u
#define VKD3D_MAX_DESCRIPTOR_SETS 64u
/* Direct3D 12 binding tier 3 has a limit of "1,000,000+" CBVs, SRVs and UAVs.
* I am not sure what the "+" is supposed to mean: it probably hints that
* implementations may have an even higher limit, but that's pretty obvious,
* that table is for guaranteed minimum limits. */
#define VKD3D_MAX_DESCRIPTOR_SET_CBVS_SRVS_UAVS 1000000u
/* D3D12 binding tier 3 has a limit of 2048 samplers. */
#define VKD3D_MAX_DESCRIPTOR_SET_SAMPLERS 2048u
/* The main limitation here is the simple descriptor pool recycling scheme
* requiring each pool to contain all descriptor types used by vkd3d. Limit
* this number to prevent excessive pool memory use. */
#define VKD3D_MAX_VIRTUAL_HEAP_DESCRIPTORS_PER_TYPE (16 * 1024u)
#define VKD3D_INITIAL_DESCRIPTORS_POOL_SIZE 1024u
#define VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT (VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER + 1)
extern uint64_t object_global_serial_id;
......@@ -770,6 +775,25 @@ static inline struct d3d12_dsv_desc *d3d12_dsv_desc_from_cpu_handle(D3D12_CPU_DE
void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_device *device,
struct d3d12_resource *resource, const D3D12_DEPTH_STENCIL_VIEW_DESC *desc);
static inline VkDescriptorType vk_descriptor_type_from_vkd3d_descriptor_type(enum vkd3d_shader_descriptor_type type,
bool is_buffer)
{
switch (type)
{
case VKD3D_SHADER_DESCRIPTOR_TYPE_SRV:
return is_buffer ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
case VKD3D_SHADER_DESCRIPTOR_TYPE_UAV:
return is_buffer ? VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER : VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
case VKD3D_SHADER_DESCRIPTOR_TYPE_CBV:
return VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
case VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER:
return VK_DESCRIPTOR_TYPE_SAMPLER;
default:
FIXME("Unhandled descriptor range type type %#x.\n", type);
return VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
}
}
enum vkd3d_vk_descriptor_set_index
{
VKD3D_SET_INDEX_SAMPLER,
......@@ -899,6 +923,8 @@ struct d3d12_root_descriptor_table_range
unsigned int vk_binding_count;
uint32_t set;
uint32_t binding;
uint32_t image_set;
uint32_t image_binding;
enum vkd3d_shader_descriptor_type type;
uint32_t descriptor_magic;
......@@ -920,6 +946,7 @@ struct d3d12_root_constant
struct d3d12_root_descriptor
{
uint32_t set;
uint32_t binding;
};
......@@ -936,7 +963,9 @@ struct d3d12_root_parameter
struct d3d12_descriptor_set_layout
{
enum vkd3d_shader_descriptor_type descriptor_type;
VkDescriptorSetLayout vk_layout;
unsigned int descriptor_count;
unsigned int unbounded_offset;
unsigned int table_index;
};
......@@ -1135,6 +1164,18 @@ struct vkd3d_buffer
VkDeviceMemory vk_memory;
};
struct vkd3d_vk_descriptor_pool
{
unsigned int descriptor_count;
VkDescriptorPool vk_pool;
};
struct vkd3d_vk_descriptor_pool_array
{
struct vkd3d_vk_descriptor_pool *pools;
size_t capacity, count;
};
/* ID3D12CommandAllocator */
struct d3d12_command_allocator
{
......@@ -1146,11 +1187,9 @@ struct d3d12_command_allocator
VkCommandPool vk_command_pool;
VkDescriptorPool vk_descriptor_pool;
VkDescriptorPool vk_descriptor_pools[VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT];
VkDescriptorPool *free_descriptor_pools;
size_t free_descriptor_pools_size;
size_t free_descriptor_pool_count;
struct vkd3d_vk_descriptor_pool_array free_descriptor_pools[VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT];
VkRenderPass *passes;
size_t passes_size;
......@@ -1160,9 +1199,8 @@ struct d3d12_command_allocator
size_t framebuffers_size;
size_t framebuffer_count;
VkDescriptorPool *descriptor_pools;
size_t descriptor_pools_size;
size_t descriptor_pool_count;
struct vkd3d_vk_descriptor_pool_array descriptor_pools[VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT];
unsigned int vk_pool_sizes[VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT];
struct vkd3d_view **views;
size_t views_size;
......@@ -1516,8 +1554,6 @@ struct vkd3d_desc_object_cache
size_t size;
};
#define VKD3D_DESCRIPTOR_POOL_COUNT 6
/* ID3D12Device */
struct d3d12_device
{
......@@ -1536,8 +1572,7 @@ struct d3d12_device
struct vkd3d_desc_object_cache view_desc_cache;
struct vkd3d_desc_object_cache cbuffer_desc_cache;
VkDescriptorPoolSize vk_pool_sizes[VKD3D_DESCRIPTOR_POOL_COUNT];
unsigned int vk_pool_count;
unsigned int vk_pool_limits[VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT];
struct vkd3d_vk_descriptor_heap_layout vk_descriptor_heap_layouts[VKD3D_SET_INDEX_COUNT];
bool use_vk_heaps;
......