libs/vkd3d: Fix draw calls with no framebuffer attachments.

This commit is contained in:
Józef Kucia 2017-08-18 17:08:56 +02:00
parent 41b7c46c3e
commit 08284f0f85
3 changed files with 28 additions and 6 deletions

View File

@ -1443,9 +1443,26 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_list_ClearState(ID3D12GraphicsCom
return E_NOTIMPL; return E_NOTIMPL;
} }
static void d3d12_command_list_get_fb_extent(struct d3d12_command_list *list,
uint32_t *width, uint32_t *height)
{
struct d3d12_device *device = list->device;
if (!list->state->u.graphics.attachment_count)
{
*width = device->vk_info.device_limits.maxFramebufferWidth;
*height = device->vk_info.device_limits.maxFramebufferHeight;
return;
}
*width = list->fb_width;
*height = list->fb_height;
}
static bool d3d12_command_list_update_current_framebuffer(struct d3d12_command_list *list, static bool d3d12_command_list_update_current_framebuffer(struct d3d12_command_list *list,
const struct vkd3d_vk_device_procs *vk_procs) const struct vkd3d_vk_device_procs *vk_procs)
{ {
struct d3d12_device *device = list->device;
struct VkFramebufferCreateInfo fb_desc; struct VkFramebufferCreateInfo fb_desc;
VkFramebuffer vk_framebuffer; VkFramebuffer vk_framebuffer;
size_t start_idx = 0; size_t start_idx = 0;
@ -1463,10 +1480,9 @@ static bool d3d12_command_list_update_current_framebuffer(struct d3d12_command_l
fb_desc.renderPass = list->state->u.graphics.render_pass; fb_desc.renderPass = list->state->u.graphics.render_pass;
fb_desc.attachmentCount = list->state->u.graphics.attachment_count; fb_desc.attachmentCount = list->state->u.graphics.attachment_count;
fb_desc.pAttachments = &list->views[start_idx]; fb_desc.pAttachments = &list->views[start_idx];
fb_desc.width = list->fb_width; d3d12_command_list_get_fb_extent(list, &fb_desc.width, &fb_desc.height);
fb_desc.height = list->fb_height;
fb_desc.layers = 1; fb_desc.layers = 1;
if ((vr = VK_CALL(vkCreateFramebuffer(list->device->vk_device, &fb_desc, NULL, &vk_framebuffer))) < 0) if ((vr = VK_CALL(vkCreateFramebuffer(device->vk_device, &fb_desc, NULL, &vk_framebuffer))) < 0)
{ {
WARN("Failed to create Vulkan framebuffer, vr %d.\n", vr); WARN("Failed to create Vulkan framebuffer, vr %d.\n", vr);
return false; return false;
@ -1475,7 +1491,7 @@ static bool d3d12_command_list_update_current_framebuffer(struct d3d12_command_l
if (!d3d12_command_allocator_add_framebuffer(list->allocator, vk_framebuffer)) if (!d3d12_command_allocator_add_framebuffer(list->allocator, vk_framebuffer))
{ {
WARN("Failed to add framebuffer.\n"); WARN("Failed to add framebuffer.\n");
VK_CALL(vkDestroyFramebuffer(list->device->vk_device, vk_framebuffer, NULL)); VK_CALL(vkDestroyFramebuffer(device->vk_device, vk_framebuffer, NULL));
return false; return false;
} }
@ -1659,8 +1675,8 @@ static bool d3d12_command_list_begin_render_pass(struct d3d12_command_list *list
begin_desc.framebuffer = list->current_framebuffer; begin_desc.framebuffer = list->current_framebuffer;
begin_desc.renderArea.offset.x = 0; begin_desc.renderArea.offset.x = 0;
begin_desc.renderArea.offset.y = 0; begin_desc.renderArea.offset.y = 0;
begin_desc.renderArea.extent.width = list->fb_width; d3d12_command_list_get_fb_extent(list,
begin_desc.renderArea.extent.height = list->fb_height; &begin_desc.renderArea.extent.width, &begin_desc.renderArea.extent.height);
begin_desc.clearValueCount = 0; begin_desc.clearValueCount = 0;
begin_desc.pClearValues = NULL; begin_desc.pClearValues = NULL;
VK_CALL(vkCmdBeginRenderPass(list->vk_command_buffer, &begin_desc, VK_SUBPASS_CONTENTS_INLINE)); VK_CALL(vkCmdBeginRenderPass(list->vk_command_buffer, &begin_desc, VK_SUBPASS_CONTENTS_INLINE));

View File

@ -438,10 +438,14 @@ static void vkd3d_init_device_caps(struct vkd3d_instance *instance,
VkPhysicalDevice physical_device, struct vkd3d_vulkan_info *vulkan_info) VkPhysicalDevice physical_device, struct vkd3d_vulkan_info *vulkan_info)
{ {
const struct vkd3d_vk_instance_procs *vk_procs = &instance->vk_procs; const struct vkd3d_vk_instance_procs *vk_procs = &instance->vk_procs;
VkPhysicalDeviceProperties device_properties;
VkExtensionProperties *vk_extensions; VkExtensionProperties *vk_extensions;
uint32_t count; uint32_t count;
VkResult vr; VkResult vr;
VK_CALL(vkGetPhysicalDeviceProperties(physical_device, &device_properties));
vulkan_info->device_limits = device_properties.limits;
if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL, if ((vr = VK_CALL(vkEnumerateDeviceExtensionProperties(physical_device, NULL,
&count, NULL))) < 0) &count, NULL))) < 0)
{ {

View File

@ -498,6 +498,8 @@ struct vkd3d_vulkan_info
{ {
bool KHR_get_physical_device_properties2; bool KHR_get_physical_device_properties2;
bool KHR_push_descriptor; bool KHR_push_descriptor;
VkPhysicalDeviceLimits device_limits;
}; };
/* ID3D12Device */ /* ID3D12Device */