vkd3d: Create common objects for fullscreen GS/VS.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2020-04-21 15:27:03 +02:00 committed by Hans-Kristian Arntzen
parent 4923d5ac04
commit da95bd6eaa
2 changed files with 52 additions and 1 deletions

View File

@ -335,20 +335,63 @@ VkExtent3D vkd3d_meta_get_clear_image_uav_workgroup_size(VkImageViewType view_ty
}
}
static HRESULT vkd3d_meta_ops_common_init(struct vkd3d_meta_ops_common *meta_ops_common, struct d3d12_device *device)
{
VkResult vr;
if (device->vk_info.EXT_shader_viewport_index_layer)
{
if ((vr = vkd3d_meta_create_shader_module(device, SPIRV_CODE(vs_fullscreen_layer_spv), &meta_ops_common->vk_module_fullscreen_vs)) < 0)
{
ERR("Failed to create shader modules, vr %d.\n", vr);
return hresult_from_vk_result(vr);
}
}
else
{
if ((vr = vkd3d_meta_create_shader_module(device, SPIRV_CODE(vs_fullscreen_spv), &meta_ops_common->vk_module_fullscreen_vs)) < 0 ||
(vr = vkd3d_meta_create_shader_module(device, SPIRV_CODE(gs_fullscreen_spv), &meta_ops_common->vk_module_fullscreen_gs)) < 0)
{
ERR("Failed to create shader modules, vr %d.\n", vr);
return hresult_from_vk_result(vr);
}
}
return S_OK;
}
static void vkd3d_meta_ops_common_cleanup(struct vkd3d_meta_ops_common *meta_ops_common, struct d3d12_device *device)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VK_CALL(vkDestroyShaderModule(device->vk_device, meta_ops_common->vk_module_fullscreen_vs, NULL));
VK_CALL(vkDestroyShaderModule(device->vk_device, meta_ops_common->vk_module_fullscreen_gs, NULL));
}
HRESULT vkd3d_meta_ops_init(struct vkd3d_meta_ops *meta_ops, struct d3d12_device *device)
{
HRESULT hr;
memset(meta_ops, 0, sizeof(*meta_ops));
meta_ops->device = device;
if (FAILED(hr = vkd3d_meta_ops_common_init(&meta_ops->common, device)))
goto fail_common;
if (FAILED(hr = vkd3d_clear_uav_ops_init(&meta_ops->clear_uav, device)))
return hr;
goto fail_clear_uav_ops;
return S_OK;
fail_clear_uav_ops:
vkd3d_meta_ops_common_cleanup(&meta_ops->common, device);
fail_common:
return hr;
}
HRESULT vkd3d_meta_ops_cleanup(struct vkd3d_meta_ops *meta_ops, struct d3d12_device *device)
{
vkd3d_clear_uav_ops_cleanup(&meta_ops->clear_uav, device);
vkd3d_meta_ops_common_cleanup(&meta_ops->common, device);
return S_OK;
}

View File

@ -1392,8 +1392,16 @@ HRESULT vkd3d_clear_uav_ops_init(struct vkd3d_clear_uav_ops *meta_clear_uav_ops,
void vkd3d_clear_uav_ops_cleanup(struct vkd3d_clear_uav_ops *meta_clear_uav_ops,
struct d3d12_device *device) DECLSPEC_HIDDEN;
struct vkd3d_meta_ops_common
{
VkShaderModule vk_module_fullscreen_vs;
VkShaderModule vk_module_fullscreen_gs;
};
struct vkd3d_meta_ops
{
struct d3d12_device *device;
struct vkd3d_meta_ops_common common;
struct vkd3d_clear_uav_ops clear_uav;
};