Removed redundant copy of buffer in HDR mode if the shader has already a HDR format i.e R10G10B10A2

This commit is contained in:
MajorPainTheCactus 2022-03-13 17:18:28 +00:00 committed by Autechre
parent 86ca2006ea
commit 32b8560858
3 changed files with 56 additions and 37 deletions

View File

@ -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);

View File

@ -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,

View File

@ -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;