[PATCH vkd3d 2/3] vkd3d: Rename d3d12_pipeline_state_init_compute_uav_counters() and handle pixel shaders.
Conor McCarthy
cmccarthy at codeweavers.com
Wed Jul 14 10:47:42 CDT 2021
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
libs/vkd3d/state.c | 27 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
index e459c998..4537e319 100644
--- a/libs/vkd3d/state.c
+++ b/libs/vkd3d/state.c
@@ -1414,9 +1414,9 @@ static HRESULT vkd3d_create_compute_pipeline(struct d3d12_device *device,
return S_OK;
}
-static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipeline_state *state,
+static HRESULT d3d12_pipeline_state_init_uav_counters(struct d3d12_pipeline_state *state,
struct d3d12_device *device, const struct d3d12_root_signature *root_signature,
- const struct vkd3d_shader_scan_descriptor_info *shader_info)
+ const struct vkd3d_shader_scan_descriptor_info *shader_info, VkShaderStageFlags stage_flags)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkDescriptorSetLayout set_layouts[VKD3D_MAX_DESCRIPTOR_SETS + 1];
@@ -1426,6 +1426,8 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel
unsigned int i, j;
HRESULT hr;
+ assert(vkd3d_popcount(stage_flags) == 1);
+
for (i = 0; i < shader_info->descriptor_count; ++i)
{
const struct vkd3d_shader_descriptor_info *d = &shader_info->descriptors[i];
@@ -1438,6 +1440,16 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel
if (!uav_counter_count)
return S_OK;
+ /* It should be possible to support other stages in Vulkan, but in a graphics pipeline
+ * D3D12 currently only supports counters in pixel shaders, and handling multiple stages
+ * would be more complex. */
+ if (!(stage_flags & (VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT)))
+ {
+ FIXME("Found a UAV counter for Vulkan shader stage %#x. UAV counters in a "
+ "graphics pipeline are only supported in pixel shaders.\n", stage_flags);
+ return E_INVALIDARG;
+ }
+
if (!(binding_desc = vkd3d_calloc(uav_counter_count, sizeof(*binding_desc))))
return E_OUTOFMEMORY;
if (!(state->uav_counters = vkd3d_calloc(uav_counter_count, sizeof(*state->uav_counters))))
@@ -1461,17 +1473,16 @@ static HRESULT d3d12_pipeline_state_init_compute_uav_counters(struct d3d12_pipel
state->uav_counters[j].register_space = d->register_space;
state->uav_counters[j].register_index = d->register_index;
- state->uav_counters[j].shader_visibility = VKD3D_SHADER_VISIBILITY_COMPUTE;
+ state->uav_counters[j].shader_visibility = (stage_flags == VK_SHADER_STAGE_COMPUTE_BIT)
+ ? VKD3D_SHADER_VISIBILITY_COMPUTE : VKD3D_SHADER_VISIBILITY_PIXEL;
state->uav_counters[j].binding.set = set_index;
state->uav_counters[j].binding.binding = descriptor_binding;
state->uav_counters[j].binding.count = 1;
- /* FIXME: For the graphics pipeline we have to take the shader
- * visibility into account. */
binding_desc[j].binding = descriptor_binding;
binding_desc[j].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
binding_desc[j].descriptorCount = 1;
- binding_desc[j].stageFlags = VK_SHADER_STAGE_ALL;
+ binding_desc[j].stageFlags = stage_flags;
binding_desc[j].pImmutableSamplers = NULL;
++descriptor_binding;
@@ -1538,8 +1549,8 @@ static HRESULT d3d12_pipeline_state_init_compute(struct d3d12_pipeline_state *st
return hresult_from_vkd3d_result(ret);
}
- if (FAILED(hr = d3d12_pipeline_state_init_compute_uav_counters(state,
- device, root_signature, &shader_info)))
+ if (FAILED(hr = d3d12_pipeline_state_init_uav_counters(state,
+ device, root_signature, &shader_info, VK_SHADER_STAGE_COMPUTE_BIT)))
{
WARN("Failed to create descriptor set layout for UAV counters, hr %#x.\n", hr);
return hr;
--
2.31.1
More information about the wine-devel
mailing list