mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
libs/vkd3d: Do not assume CBV root parameter index is equal to Vulkan descriptor binding.
This commit is contained in:
@@ -2339,26 +2339,11 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetGraphicsRootDescriptorTable(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void d3d12_command_list_set_root_constants(struct d3d12_command_list *list,
|
static void d3d12_command_list_set_root_constants(struct d3d12_command_list *list,
|
||||||
struct d3d12_root_signature *root_signature, unsigned int root_parameter_index,
|
struct d3d12_root_signature *root_signature, unsigned int index,
|
||||||
unsigned int offset, unsigned int count, const void *data)
|
unsigned int offset, unsigned int count, const void *data)
|
||||||
{
|
{
|
||||||
|
const struct d3d12_root_constant *constant = &root_signature->parameters[index].u.constant;
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
||||||
struct d3d12_root_constant *constant = NULL;
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < root_signature->constant_count; ++i)
|
|
||||||
{
|
|
||||||
if (root_signature->constants[i].root_parameter_index == root_parameter_index)
|
|
||||||
{
|
|
||||||
constant = &root_signature->constants[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!constant)
|
|
||||||
{
|
|
||||||
WARN("Invalid root parameter index %u.\n", root_parameter_index);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
VK_CALL(vkCmdPushConstants(list->vk_command_buffer, root_signature->vk_pipeline_layout,
|
VK_CALL(vkCmdPushConstants(list->vk_command_buffer, root_signature->vk_pipeline_layout,
|
||||||
constant->stage_flags, constant->offset + offset * sizeof(uint32_t), count * sizeof(uint32_t), data));
|
constant->stage_flags, constant->offset + offset * sizeof(uint32_t), count * sizeof(uint32_t), data));
|
||||||
@@ -2413,9 +2398,10 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetGraphicsRoot32BitConstants(I
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void d3d12_command_list_set_root_cbv(struct d3d12_command_list *list,
|
static void d3d12_command_list_set_root_cbv(struct d3d12_command_list *list,
|
||||||
VkDescriptorSet descriptor_set, unsigned int root_parameter_index,
|
struct d3d12_root_signature *root_signature, VkDescriptorSet descriptor_set,
|
||||||
D3D12_GPU_VIRTUAL_ADDRESS gpu_address)
|
unsigned int index, D3D12_GPU_VIRTUAL_ADDRESS gpu_address)
|
||||||
{
|
{
|
||||||
|
const struct d3d12_root_descriptor *root_descriptor = &root_signature->parameters[index].u.descriptor;
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
||||||
struct VkWriteDescriptorSet descriptor_write;
|
struct VkWriteDescriptorSet descriptor_write;
|
||||||
struct VkDescriptorBufferInfo buffer_info;
|
struct VkDescriptorBufferInfo buffer_info;
|
||||||
@@ -2429,7 +2415,7 @@ static void d3d12_command_list_set_root_cbv(struct d3d12_command_list *list,
|
|||||||
descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
descriptor_write.pNext = NULL;
|
descriptor_write.pNext = NULL;
|
||||||
descriptor_write.dstSet = descriptor_set;
|
descriptor_write.dstSet = descriptor_set;
|
||||||
descriptor_write.dstBinding = root_parameter_index;
|
descriptor_write.dstBinding = root_descriptor->binding;
|
||||||
descriptor_write.dstArrayElement = 0;
|
descriptor_write.dstArrayElement = 0;
|
||||||
descriptor_write.descriptorCount = 1;
|
descriptor_write.descriptorCount = 1;
|
||||||
descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||||
@@ -2447,7 +2433,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetComputeRootConstantBufferVie
|
|||||||
TRACE("iface %p, root_parameter_index %u, address %#"PRIx64".\n",
|
TRACE("iface %p, root_parameter_index %u, address %#"PRIx64".\n",
|
||||||
iface, root_parameter_index, address);
|
iface, root_parameter_index, address);
|
||||||
|
|
||||||
d3d12_command_list_set_root_cbv(list, list->compute_descriptor_set, root_parameter_index, address);
|
d3d12_command_list_set_root_cbv(list, list->compute_root_signature,
|
||||||
|
list->compute_descriptor_set, root_parameter_index, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void STDMETHODCALLTYPE d3d12_command_list_SetGraphicsRootConstantBufferView(
|
static void STDMETHODCALLTYPE d3d12_command_list_SetGraphicsRootConstantBufferView(
|
||||||
@@ -2458,7 +2445,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetGraphicsRootConstantBufferVi
|
|||||||
TRACE("iface %p, root_parameter_index %u, address %#"PRIx64".\n",
|
TRACE("iface %p, root_parameter_index %u, address %#"PRIx64".\n",
|
||||||
iface, root_parameter_index, address);
|
iface, root_parameter_index, address);
|
||||||
|
|
||||||
d3d12_command_list_set_root_cbv(list, list->graphics_descriptor_set, root_parameter_index, address);
|
d3d12_command_list_set_root_cbv(list, list->graphics_root_signature,
|
||||||
|
list->graphics_descriptor_set, root_parameter_index, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void STDMETHODCALLTYPE d3d12_command_list_SetComputeRootShaderResourceView(
|
static void STDMETHODCALLTYPE d3d12_command_list_SetComputeRootShaderResourceView(
|
||||||
|
@@ -72,10 +72,11 @@ static void d3d12_root_signature_cleanup(struct d3d12_root_signature *root_signa
|
|||||||
if (root_signature->vk_set_layout)
|
if (root_signature->vk_set_layout)
|
||||||
VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, root_signature->vk_set_layout, NULL));
|
VK_CALL(vkDestroyDescriptorSetLayout(device->vk_device, root_signature->vk_set_layout, NULL));
|
||||||
|
|
||||||
|
if (root_signature->parameters)
|
||||||
|
vkd3d_free(root_signature->parameters);
|
||||||
|
|
||||||
if (root_signature->descriptor_mapping)
|
if (root_signature->descriptor_mapping)
|
||||||
vkd3d_free(root_signature->descriptor_mapping);
|
vkd3d_free(root_signature->descriptor_mapping);
|
||||||
if (root_signature->constants)
|
|
||||||
vkd3d_free(root_signature->constants);
|
|
||||||
if (root_signature->push_constants)
|
if (root_signature->push_constants)
|
||||||
vkd3d_free(root_signature->push_constants);
|
vkd3d_free(root_signature->push_constants);
|
||||||
|
|
||||||
@@ -451,6 +452,7 @@ static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signat
|
|||||||
|
|
||||||
for (i = 0, j = 0; i < desc->NumParameters; ++i)
|
for (i = 0, j = 0; i < desc->NumParameters; ++i)
|
||||||
{
|
{
|
||||||
|
struct d3d12_root_constant *root_constant = &root_signature->parameters[i].u.constant;
|
||||||
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
|
const D3D12_ROOT_PARAMETER *p = &desc->pParameters[i];
|
||||||
unsigned int idx;
|
unsigned int idx;
|
||||||
|
|
||||||
@@ -468,10 +470,9 @@ static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signat
|
|||||||
offset = push_constants_offset[idx];
|
offset = push_constants_offset[idx];
|
||||||
push_constants_offset[idx] += p->u.Constants.Num32BitValues * sizeof(uint32_t);
|
push_constants_offset[idx] += p->u.Constants.Num32BitValues * sizeof(uint32_t);
|
||||||
|
|
||||||
root_signature->constants[j].root_parameter_index = i;
|
root_constant->stage_flags = push_count == 1
|
||||||
root_signature->constants[j].stage_flags = push_count == 1
|
|
||||||
? push_constants[0].stageFlags : stage_flags_from_visibility(p->ShaderVisibility);
|
? push_constants[0].stageFlags : stage_flags_from_visibility(p->ShaderVisibility);
|
||||||
root_signature->constants[j].offset = offset;
|
root_constant->offset = offset;
|
||||||
|
|
||||||
root_signature->push_constants[j].register_index = p->u.Constants.ShaderRegister;
|
root_signature->push_constants[j].register_index = p->u.Constants.ShaderRegister;
|
||||||
root_signature->push_constants[j].shader_visibility
|
root_signature->push_constants[j].shader_visibility
|
||||||
@@ -523,8 +524,8 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
|
|||||||
root_signature->vk_pipeline_layout = VK_NULL_HANDLE;
|
root_signature->vk_pipeline_layout = VK_NULL_HANDLE;
|
||||||
root_signature->pool_sizes = NULL;
|
root_signature->pool_sizes = NULL;
|
||||||
root_signature->vk_set_layout = VK_NULL_HANDLE;
|
root_signature->vk_set_layout = VK_NULL_HANDLE;
|
||||||
|
root_signature->parameters = NULL;
|
||||||
root_signature->descriptor_mapping = NULL;
|
root_signature->descriptor_mapping = NULL;
|
||||||
root_signature->constants = NULL;
|
|
||||||
root_signature->static_sampler_count = 0;
|
root_signature->static_sampler_count = 0;
|
||||||
root_signature->static_samplers = NULL;
|
root_signature->static_samplers = NULL;
|
||||||
|
|
||||||
@@ -534,6 +535,13 @@ 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;
|
||||||
|
|
||||||
|
if (!(root_signature->parameters = vkd3d_calloc(desc->NumParameters,
|
||||||
|
sizeof(*root_signature->parameters))))
|
||||||
|
{
|
||||||
|
hr = E_OUTOFMEMORY;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(binding_desc = vkd3d_calloc(info.descriptor_count, sizeof(*binding_desc))))
|
if (!(binding_desc = vkd3d_calloc(info.descriptor_count, sizeof(*binding_desc))))
|
||||||
{
|
{
|
||||||
hr = E_OUTOFMEMORY;
|
hr = E_OUTOFMEMORY;
|
||||||
@@ -547,12 +555,6 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
root_signature->constant_count = info.root_constant_count;
|
root_signature->constant_count = info.root_constant_count;
|
||||||
if (!(root_signature->constants = vkd3d_calloc(root_signature->constant_count,
|
|
||||||
sizeof(*root_signature->constants))))
|
|
||||||
{
|
|
||||||
hr = E_OUTOFMEMORY;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
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))))
|
||||||
{
|
{
|
||||||
@@ -617,6 +619,8 @@ static HRESULT d3d12_root_signature_init(struct d3d12_root_signature *root_signa
|
|||||||
cur_binding->stageFlags = stage_flags_from_visibility(p->ShaderVisibility);
|
cur_binding->stageFlags = stage_flags_from_visibility(p->ShaderVisibility);
|
||||||
cur_binding->pImmutableSamplers = NULL;
|
cur_binding->pImmutableSamplers = NULL;
|
||||||
|
|
||||||
|
root_signature->parameters[i].u.descriptor.binding = cur_binding->binding;
|
||||||
|
|
||||||
++cur_binding;
|
++cur_binding;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -264,11 +264,24 @@ HRESULT d3d12_query_heap_create(struct d3d12_device *device,
|
|||||||
|
|
||||||
struct d3d12_root_constant
|
struct d3d12_root_constant
|
||||||
{
|
{
|
||||||
unsigned int root_parameter_index;
|
|
||||||
VkShaderStageFlags stage_flags;
|
VkShaderStageFlags stage_flags;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct d3d12_root_descriptor
|
||||||
|
{
|
||||||
|
uint32_t binding;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct d3d12_root_parameter
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct d3d12_root_constant constant;
|
||||||
|
struct d3d12_root_descriptor descriptor;
|
||||||
|
} u;
|
||||||
|
};
|
||||||
|
|
||||||
/* ID3D12RootSignature */
|
/* ID3D12RootSignature */
|
||||||
struct d3d12_root_signature
|
struct d3d12_root_signature
|
||||||
{
|
{
|
||||||
@@ -281,11 +294,12 @@ struct d3d12_root_signature
|
|||||||
struct VkDescriptorPoolSize *pool_sizes;
|
struct VkDescriptorPoolSize *pool_sizes;
|
||||||
size_t pool_size_count;
|
size_t pool_size_count;
|
||||||
|
|
||||||
|
struct d3d12_root_parameter *parameters;
|
||||||
|
|
||||||
unsigned int descriptor_count;
|
unsigned int descriptor_count;
|
||||||
struct vkd3d_shader_resource_binding *descriptor_mapping;
|
struct vkd3d_shader_resource_binding *descriptor_mapping;
|
||||||
|
|
||||||
unsigned int constant_count;
|
unsigned int constant_count;
|
||||||
struct d3d12_root_constant *constants;
|
|
||||||
struct vkd3d_shader_push_constant *push_constants;
|
struct vkd3d_shader_push_constant *push_constants;
|
||||||
|
|
||||||
unsigned int static_sampler_count;
|
unsigned int static_sampler_count;
|
||||||
|
@@ -7009,11 +7009,12 @@ static void test_cs_constant_buffer(void)
|
|||||||
ID3D12PipelineState *pipeline_state;
|
ID3D12PipelineState *pipeline_state;
|
||||||
D3D12_RESOURCE_DESC resource_desc;
|
D3D12_RESOURCE_DESC resource_desc;
|
||||||
ID3D12Resource *resource, *cb;
|
ID3D12Resource *resource, *cb;
|
||||||
|
unsigned int descriptor_size;
|
||||||
struct resource_readback rb;
|
struct resource_readback rb;
|
||||||
struct test_context context;
|
struct test_context context;
|
||||||
ID3D12CommandQueue *queue;
|
ID3D12CommandQueue *queue;
|
||||||
ID3D12Device *device;
|
ID3D12Device *device;
|
||||||
unsigned int x;
|
unsigned int i, x;
|
||||||
float value;
|
float value;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
@@ -7074,7 +7075,7 @@ static void test_cs_constant_buffer(void)
|
|||||||
ok(SUCCEEDED(hr), "Failed to create buffer, hr %#x.\n", hr);
|
ok(SUCCEEDED(hr), "Failed to create buffer, hr %#x.\n", hr);
|
||||||
|
|
||||||
descriptor_ranges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
|
descriptor_ranges[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
|
||||||
descriptor_ranges[0].NumDescriptors = 1;
|
descriptor_ranges[0].NumDescriptors = 4;
|
||||||
descriptor_ranges[0].BaseShaderRegister = 0;
|
descriptor_ranges[0].BaseShaderRegister = 0;
|
||||||
descriptor_ranges[0].RegisterSpace = 0;
|
descriptor_ranges[0].RegisterSpace = 0;
|
||||||
descriptor_ranges[0].OffsetInDescriptorsFromTableStart = 0;
|
descriptor_ranges[0].OffsetInDescriptorsFromTableStart = 0;
|
||||||
@@ -7098,13 +7099,16 @@ static void test_cs_constant_buffer(void)
|
|||||||
shader_bytecode(cs_code, sizeof(cs_code)));
|
shader_bytecode(cs_code, sizeof(cs_code)));
|
||||||
|
|
||||||
heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
|
||||||
heap_desc.NumDescriptors = 1;
|
heap_desc.NumDescriptors = 4;
|
||||||
heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
|
||||||
heap_desc.NodeMask = 0;
|
heap_desc.NodeMask = 0;
|
||||||
hr = ID3D12Device_CreateDescriptorHeap(device, &heap_desc,
|
hr = ID3D12Device_CreateDescriptorHeap(device, &heap_desc,
|
||||||
&IID_ID3D12DescriptorHeap, (void **)&descriptor_heap);
|
&IID_ID3D12DescriptorHeap, (void **)&descriptor_heap);
|
||||||
ok(SUCCEEDED(hr), "Failed to create descriptor heap, hr %#x.\n", hr);
|
ok(SUCCEEDED(hr), "Failed to create descriptor heap, hr %#x.\n", hr);
|
||||||
|
|
||||||
|
descriptor_size = ID3D12Device_GetDescriptorHandleIncrementSize(device,
|
||||||
|
D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
|
||||||
|
|
||||||
cpu_descriptor_handle = ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(descriptor_heap);
|
cpu_descriptor_handle = ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(descriptor_heap);
|
||||||
gpu_descriptor_handle = ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap);
|
gpu_descriptor_handle = ID3D12DescriptorHeap_GetGPUDescriptorHandleForHeapStart(descriptor_heap);
|
||||||
|
|
||||||
@@ -7116,6 +7120,12 @@ static void test_cs_constant_buffer(void)
|
|||||||
uav_desc.Buffer.CounterOffsetInBytes = 0;
|
uav_desc.Buffer.CounterOffsetInBytes = 0;
|
||||||
uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
|
uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
|
||||||
ID3D12Device_CreateUnorderedAccessView(device, resource, NULL, &uav_desc, cpu_descriptor_handle);
|
ID3D12Device_CreateUnorderedAccessView(device, resource, NULL, &uav_desc, cpu_descriptor_handle);
|
||||||
|
/* For tier 1 hardware all descriptors must be populated. */
|
||||||
|
for (i = 1; i < heap_desc.NumDescriptors; ++i)
|
||||||
|
{
|
||||||
|
cpu_descriptor_handle.ptr += descriptor_size;
|
||||||
|
ID3D12Device_CreateUnorderedAccessView(device, NULL, NULL, &uav_desc, cpu_descriptor_handle);
|
||||||
|
}
|
||||||
|
|
||||||
ID3D12GraphicsCommandList_SetComputeRootSignature(command_list, root_signature);
|
ID3D12GraphicsCommandList_SetComputeRootSignature(command_list, root_signature);
|
||||||
ID3D12GraphicsCommandList_SetComputeRootConstantBufferView(command_list, 1,
|
ID3D12GraphicsCommandList_SetComputeRootConstantBufferView(command_list, 1,
|
||||||
|
Reference in New Issue
Block a user