diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index eb7e6266d5..bf1d2adeb4 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -1076,12 +1076,18 @@ static bool d3d11_init_swapchain(d3d11_video_t* d3d11, d3d11->hdr.max_cll, d3d11->hdr.max_fall); - memset(&d3d11->back_buffer, 0, sizeof(d3d11->back_buffer)); - d3d11->back_buffer.desc.Width = width; - d3d11->back_buffer.desc.Height = height; - d3d11->back_buffer.desc.Format = d3d11->shader_preset && d3d11->shader_preset->passes ? glslang_format_to_dxgi(d3d11->pass[d3d11->shader_preset->passes - 1].semantics.format) : DXGI_FORMAT_R8G8B8A8_UNORM; - d3d11->back_buffer.desc.BindFlags = D3D11_BIND_RENDER_TARGET; - d3d11_init_texture(d3d11->device, &d3d11->back_buffer); + DXGI_FORMAT back_buffer_format = d3d11->shader_preset && d3d11->shader_preset->passes ? glslang_format_to_dxgi(d3d11->pass[d3d11->shader_preset->passes - 1].semantics.format) : DXGI_FORMAT_R8G8B8A8_UNORM; + bool use_back_buffer = back_buffer_format == d3d11->chain_formats[d3d11->chain_bit_depth]; + + if(use_back_buffer) + { + memset(&d3d11->back_buffer, 0, sizeof(d3d11->back_buffer)); + d3d11->back_buffer.desc.Width = width; + d3d11->back_buffer.desc.Height = height; + d3d11->back_buffer.desc.Format = back_buffer_format; + d3d11->back_buffer.desc.BindFlags = D3D11_BIND_RENDER_TARGET; + d3d11_init_texture(d3d11->device, &d3d11->back_buffer); + } #endif dxgiFactory->lpVtbl->Release(dxgiFactory); @@ -1773,6 +1779,8 @@ static bool d3d11_gfx_frame( #endif #ifdef HAVE_DXGI_HDR bool video_hdr_enable = video_info->hdr_enable; + DXGI_FORMAT back_buffer_format = d3d11->shader_preset && d3d11->shader_preset->passes ? glslang_format_to_dxgi(d3d11->pass[d3d11->shader_preset->passes - 1].semantics.format) : DXGI_FORMAT_R8G8B8A8_UNORM; + bool use_back_buffer = back_buffer_format == d3d11->chain_formats[d3d11->chain_bit_depth]; if ( d3d11->resize_chain || (d3d11->hdr.enable != video_hdr_enable)) @@ -1821,12 +1829,15 @@ static bool d3d11_gfx_frame( if(d3d11->hdr.enable) { - memset(&d3d11->back_buffer, 0, sizeof(d3d11->back_buffer)); - d3d11->back_buffer.desc.Width = video_width; - d3d11->back_buffer.desc.Height = video_height; - d3d11->back_buffer.desc.Format = d3d11->shader_preset && d3d11->shader_preset->passes ? glslang_format_to_dxgi(d3d11->pass[d3d11->shader_preset->passes - 1].semantics.format) : DXGI_FORMAT_R8G8B8A8_UNORM; - d3d11->back_buffer.desc.BindFlags = D3D11_BIND_RENDER_TARGET; - d3d11_init_texture(d3d11->device, &d3d11->back_buffer); + if(use_back_buffer) + { + memset(&d3d11->back_buffer, 0, sizeof(d3d11->back_buffer)); + d3d11->back_buffer.desc.Width = video_width; + d3d11->back_buffer.desc.Height = video_height; + d3d11->back_buffer.desc.Format = back_buffer_format; + d3d11->back_buffer.desc.BindFlags = D3D11_BIND_RENDER_TARGET; + d3d11_init_texture(d3d11->device, &d3d11->back_buffer); + } dxgi_swapchain_color_space( d3d11->swapChain, @@ -2054,7 +2065,7 @@ static bool d3d11_gfx_frame( #ifdef HAVE_DXGI_HDR - if(d3d11->hdr.enable) + if(d3d11->hdr.enable && use_back_buffer) { D3D11SetRenderTargets(context, 1, &d3d11->back_buffer.rt_view, NULL); D3D11ClearRenderTargetView(context, d3d11->back_buffer.rt_view, d3d11->clearcolor); @@ -2165,7 +2176,7 @@ static bool d3d11_gfx_frame( #ifdef HAVE_DXGI_HDR /* Copy over back buffer to swap chain render targets */ - if(d3d11->hdr.enable) + if(d3d11->hdr.enable && use_back_buffer) { ID3D11ShaderResourceView* nullSRV[1] = {NULL}; D3D11SetRenderTargets(context, 1, &rtv, NULL); diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index c56a47b5cd..d5e0c09593 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -1459,6 +1459,8 @@ static bool d3d12_gfx_frame( #endif #ifdef HAVE_DXGI_HDR bool video_hdr_enable = video_info->hdr_enable; + DXGI_FORMAT back_buffer_format = d3d12->shader_preset && d3d12->shader_preset->passes ? glslang_format_to_dxgi(d3d12->pass[d3d12->shader_preset->passes - 1].semantics.format) : DXGI_FORMAT_R8G8B8A8_UNORM; + bool use_back_buffer = back_buffer_format != d3d12->chain.formats[d3d12->chain.bit_depth]; if (d3d12->resize_chain || (d3d12->hdr.enable != video_hdr_enable)) #else if (d3d12->resize_chain) @@ -1526,19 +1528,22 @@ static bool d3d12_gfx_frame( if(d3d12->hdr.enable) { - memset(&d3d12->chain.back_buffer, - 0, sizeof(d3d12->chain.back_buffer)); - d3d12->chain.back_buffer.desc.Width = video_width; - d3d12->chain.back_buffer.desc.Height = video_height; - d3d12->chain.back_buffer.desc.Format = d3d12->shader_preset && d3d12->shader_preset->passes ? glslang_format_to_dxgi(d3d12->pass[d3d12->shader_preset->passes - 1].semantics.format) : DXGI_FORMAT_R8G8B8A8_UNORM; - d3d12->chain.back_buffer.desc.Flags = - D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; - d3d12->chain.back_buffer.srv_heap = &d3d12->desc.srv_heap; - d3d12->chain.back_buffer.rt_view.ptr = - d3d12->desc.rtv_heap.cpu.ptr - + countof(d3d12->chain.renderTargets) - * d3d12->desc.rtv_heap.stride; - d3d12_init_texture(d3d12->device, &d3d12->chain.back_buffer); + if(use_back_buffer) + { + memset(&d3d12->chain.back_buffer, + 0, sizeof(d3d12->chain.back_buffer)); + d3d12->chain.back_buffer.desc.Width = video_width; + d3d12->chain.back_buffer.desc.Height = video_height; + d3d12->chain.back_buffer.desc.Format = back_buffer_format; + d3d12->chain.back_buffer.desc.Flags = + D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; + d3d12->chain.back_buffer.srv_heap = &d3d12->desc.srv_heap; + d3d12->chain.back_buffer.rt_view.ptr = + d3d12->desc.rtv_heap.cpu.ptr + + countof(d3d12->chain.renderTargets) + * d3d12->desc.rtv_heap.stride; + d3d12_init_texture(d3d12->device, &d3d12->chain.back_buffer); + } dxgi_swapchain_color_space(d3d12->chain.handle, &d3d12->chain.color_space, @@ -1856,7 +1861,7 @@ static bool d3d12_gfx_frame( d3d12->chain.handle); #ifdef HAVE_DXGI_HDR - if(d3d12->hdr.enable) + if(d3d12->hdr.enable && use_back_buffer) { d3d12_resource_transition( d3d12->queue.cmd, d3d12->chain.back_buffer.handle, @@ -1998,7 +2003,7 @@ static bool d3d12_gfx_frame( #ifdef HAVE_DXGI_HDR /* Copy over back buffer to swap chain render targets */ - if (d3d12->hdr.enable) + if (d3d12->hdr.enable && use_back_buffer) { d3d12_resource_transition( d3d12->queue.cmd, diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index bc5cb1eab4..a55b1a8900 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -1944,6 +1944,12 @@ static bool vulkan_frame(void *data, const void *frame, vk->context->current_swapchain_index; bool overlay_behind_menu = video_info->overlay_behind_menu; +#ifdef VULKAN_HDR_SWAPCHAIN + struct video_shader* shader_preset = vulkan_filter_chain_get_preset(vk->filter_chain); + VkFormat main_buffer_format = shader_preset && shader_preset->passes ? vulkan_filter_chain_get_pass_rt_format(vk->filter_chain, shader_preset->passes - 1) : VK_FORMAT_R8G8B8A8_UNORM; + bool use_main_buffer = main_buffer_format != vk->context->swapchain_format; +#endif /* VULKAN_HDR_SWAPCHAIN */ + /* Bookkeeping on start of frame. */ struct vk_per_frame *chain = &vk->swapchain[frame_index]; struct vk_image *backbuffer = &vk->backbuffers[swapchain_index]; @@ -2191,7 +2197,7 @@ static bool vulkan_frame(void *data, const void *frame, #endif #ifdef VULKAN_HDR_SWAPCHAIN - if(vk->context->hdr_enable) + if(vk->context->hdr_enable && use_main_buffer) { backbuffer = &vk->main_buffer; } @@ -2303,7 +2309,7 @@ static bool vulkan_frame(void *data, const void *frame, #ifdef VULKAN_HDR_SWAPCHAIN /* Copy over back buffer to swap chain render targets */ - if (vk->context->hdr_enable) + if (vk->context->hdr_enable && use_main_buffer) { backbuffer = &vk->backbuffers[swapchain_index]; @@ -2663,13 +2669,10 @@ static bool vulkan_frame(void *data, const void *frame, if (!(vk->hdr.support = vk->context->swapchain_colour_space == VK_COLOR_SPACE_HDR10_ST2084_EXT)) vk->context->hdr_enable = false; - if(vk->context->hdr_enable) + if(vk->context->hdr_enable && use_main_buffer) { memset(&vk->main_buffer, 0, sizeof(vk->main_buffer)); - struct video_shader* shader_preset = vulkan_filter_chain_get_preset(vk->filter_chain); - VkFormat format = shader_preset && shader_preset->passes ? vulkan_filter_chain_get_pass_rt_format(vk->filter_chain, shader_preset->passes - 1) : VK_FORMAT_R8G8B8A8_UNORM; - { /* Create the image */ VkMemoryRequirements mem_reqs; @@ -2677,7 +2680,7 @@ static bool vulkan_frame(void *data, const void *frame, VkMemoryAllocateInfo alloc = { VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO }; image_info.imageType = VK_IMAGE_TYPE_2D; - image_info.format = format; + image_info.format = main_buffer_format; image_info.extent.width = video_width; image_info.extent.height = video_height; image_info.extent.depth = 1; @@ -2709,7 +2712,7 @@ static bool vulkan_frame(void *data, const void *frame, VkImageViewCreateInfo view = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO }; view.viewType = VK_IMAGE_VIEW_TYPE_2D; - view.format = format; + view.format = main_buffer_format; view.image = vk->main_buffer.image; view.subresourceRange.baseMipLevel = 0; view.subresourceRange.baseArrayLayer = 0;