From 53b24791e592fafdd224ea5c39bb7472bfebf52b Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 14 Feb 2015 21:02:16 +0000 Subject: [PATCH] Add handling for RGBA16 backbuffers (with linear contents) --- renderdoc/driver/d3d11/d3d11_device.cpp | 17 +++++++++++++++++ renderdocui/Windows/TextureViewer.cs | 21 +++++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index 698ec3ea3..67061e541 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -2679,6 +2679,23 @@ bool WrappedID3D11Device::EndFrameCapture(void *wnd) dst[1] = src[1]; dst[2] = src[0]; } + else if(fmt.compByteWidth == 2) // R16G16B16A16 backbuffer + { + uint16_t *src16 = (uint16_t *)src; + + float linearR = RDCCLAMP(ConvertFromHalf(src16[0]), 0.0f, 1.0f); + float linearG = RDCCLAMP(ConvertFromHalf(src16[1]), 0.0f, 1.0f); + float linearB = RDCCLAMP(ConvertFromHalf(src16[2]), 0.0f, 1.0f); + + if(linearR < 0.0031308f) dst[0] = byte(255.0f*(12.92f * linearR)); + else dst[0] = byte(255.0f*(1.055f * powf(linearR, 1.0f/2.4f) - 0.055f)); + + if(linearG < 0.0031308f) dst[1] = byte(255.0f*(12.92f * linearG)); + else dst[1] = byte(255.0f*(1.055f * powf(linearG, 1.0f/2.4f) - 0.055f)); + + if(linearB < 0.0031308f) dst[2] = byte(255.0f*(12.92f * linearB)); + else dst[2] = byte(255.0f*(1.055f * powf(linearB, 1.0f/2.4f) - 0.055f)); + } else { dst[0] = src[0]; diff --git a/renderdocui/Windows/TextureViewer.cs b/renderdocui/Windows/TextureViewer.cs index ef2db69e2..3e97194b5 100644 --- a/renderdocui/Windows/TextureViewer.cs +++ b/renderdocui/Windows/TextureViewer.cs @@ -1613,12 +1613,25 @@ namespace renderdocui.Windows channelStrip.SuspendLayout(); - if (tex != null && !tex.format.srgbCorrected) - gammaDisplay.Enabled = true; - else + if (tex != null && (tex.creationFlags & TextureCreationFlags.SwapBuffer) != 0) + { + // swapbuffer is always srgb for 8-bit types, linear for 16-bit types gammaDisplay.Enabled = false; - m_TexDisplay.linearDisplayAsGamma = gammaDisplay.Checked; + if (tex.format.compByteWidth == 2 && !tex.format.special) + m_TexDisplay.linearDisplayAsGamma = false; + else + m_TexDisplay.linearDisplayAsGamma = true; + } + else + { + if (tex != null && !tex.format.srgbCorrected) + gammaDisplay.Enabled = true; + else + gammaDisplay.Enabled = false; + + m_TexDisplay.linearDisplayAsGamma = gammaDisplay.Checked; + } if (tex != null && (tex.creationFlags & TextureCreationFlags.DSV) > 0 && (string)channels.SelectedItem != "Custom")