Commit 7d3b452
committed
VIDEO/D3D: HDR screenshot support for D3D11 and D3D12 read_viewport
Both drivers previously bailed out with "HDR screenshot not supported"
when the swapchain was in HDR10 PQ (R10G10B10A2_UNORM) or scRGB
(R16G16B16A16_FLOAT) format, falling back to the raw core framebuffer
path and losing shaders, overlays, scaling and everything else the
GPU had composed.
Add a shared CPU-side HDR -> SDR decoder in gfx/common/dxgi_common:
bool dxgi_hdr_readback_to_bgr24(src_format, src_data, src_pitch,
src_x, src_y, width, height,
paper_white_nits, dst_bgr24);
which runs the inverse of the forward composition path and writes
sRGB-encoded BGR24 bottom-up, matching the read_viewport contract
the rest of the frontend expects. Implementation is pure C: an
IEEE 754 binary16 -> binary32 decoder for scRGB, an ST.2084 PQ EOTF
for HDR10, BT.2020 -> BT.709 primaries rotation, a hue-preserving
peak-channel tonemap (mirroring the forward inverse-tonemap), and
an sRGB OETF for writing to UNORM8.
At default settings (max_nits == paper_white_nits) the round-trip
is analytically exact for in-range SDR content; super-bright and
out-of-gamut pixels clamp in the OETF, which is the desired tonemapped
screenshot behaviour.
Wire both d3d11_gfx_read_viewport and d3d12_gfx_read_viewport to the
helper: remove the HDR early-return, route the two HDR swapchain
formats through the decoder, and pass d3dNN->hdr.ubo_values.
paper_white_nits as the calibration input. The SDR RGBA8 / BGRA8
paths are unchanged except for a cosmetic enum refactor in D3D12.
Known limitations (tracked for a follow-up):
- ExpandGamut is not reversed; non-default gamut expansions produce
slightly desaturated screenshots relative to on-display output.
- Per-pixel CPU cost, roughly 1.6 ms at 4K per screenshot. The
read_viewport signature permits moving this to a GPU tonemap pass
behind the same ABI at a later date without touching callers.
- Tonemap() uses paper_white for both max and reference white,
matching the existing forward composition in hdr_sm5.hlsl.h and
hdr.frag rather than fixing it here.1 parent d3ce5a0 commit 7d3b452
4 files changed
Lines changed: 365 additions & 70 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2912 | 2912 | | |
2913 | 2913 | | |
2914 | 2914 | | |
| 2915 | + | |
| 2916 | + | |
| 2917 | + | |
| 2918 | + | |
| 2919 | + | |
| 2920 | + | |
| 2921 | + | |
| 2922 | + | |
| 2923 | + | |
| 2924 | + | |
| 2925 | + | |
| 2926 | + | |
| 2927 | + | |
| 2928 | + | |
| 2929 | + | |
| 2930 | + | |
| 2931 | + | |
| 2932 | + | |
| 2933 | + | |
| 2934 | + | |
| 2935 | + | |
| 2936 | + | |
| 2937 | + | |
| 2938 | + | |
| 2939 | + | |
| 2940 | + | |
| 2941 | + | |
| 2942 | + | |
| 2943 | + | |
| 2944 | + | |
| 2945 | + | |
| 2946 | + | |
| 2947 | + | |
| 2948 | + | |
| 2949 | + | |
| 2950 | + | |
| 2951 | + | |
| 2952 | + | |
| 2953 | + | |
| 2954 | + | |
| 2955 | + | |
| 2956 | + | |
| 2957 | + | |
| 2958 | + | |
| 2959 | + | |
| 2960 | + | |
| 2961 | + | |
| 2962 | + | |
| 2963 | + | |
| 2964 | + | |
| 2965 | + | |
| 2966 | + | |
| 2967 | + | |
| 2968 | + | |
| 2969 | + | |
| 2970 | + | |
| 2971 | + | |
| 2972 | + | |
| 2973 | + | |
| 2974 | + | |
| 2975 | + | |
| 2976 | + | |
| 2977 | + | |
| 2978 | + | |
| 2979 | + | |
| 2980 | + | |
| 2981 | + | |
| 2982 | + | |
| 2983 | + | |
| 2984 | + | |
| 2985 | + | |
| 2986 | + | |
| 2987 | + | |
| 2988 | + | |
| 2989 | + | |
| 2990 | + | |
| 2991 | + | |
| 2992 | + | |
| 2993 | + | |
| 2994 | + | |
| 2995 | + | |
| 2996 | + | |
| 2997 | + | |
| 2998 | + | |
| 2999 | + | |
| 3000 | + | |
| 3001 | + | |
| 3002 | + | |
| 3003 | + | |
| 3004 | + | |
| 3005 | + | |
| 3006 | + | |
| 3007 | + | |
| 3008 | + | |
| 3009 | + | |
| 3010 | + | |
| 3011 | + | |
| 3012 | + | |
| 3013 | + | |
| 3014 | + | |
| 3015 | + | |
| 3016 | + | |
| 3017 | + | |
| 3018 | + | |
| 3019 | + | |
| 3020 | + | |
| 3021 | + | |
| 3022 | + | |
| 3023 | + | |
| 3024 | + | |
| 3025 | + | |
| 3026 | + | |
| 3027 | + | |
| 3028 | + | |
| 3029 | + | |
| 3030 | + | |
| 3031 | + | |
| 3032 | + | |
| 3033 | + | |
| 3034 | + | |
| 3035 | + | |
| 3036 | + | |
| 3037 | + | |
| 3038 | + | |
| 3039 | + | |
| 3040 | + | |
| 3041 | + | |
| 3042 | + | |
| 3043 | + | |
| 3044 | + | |
| 3045 | + | |
| 3046 | + | |
| 3047 | + | |
| 3048 | + | |
| 3049 | + | |
| 3050 | + | |
| 3051 | + | |
| 3052 | + | |
| 3053 | + | |
| 3054 | + | |
| 3055 | + | |
| 3056 | + | |
| 3057 | + | |
| 3058 | + | |
| 3059 | + | |
| 3060 | + | |
| 3061 | + | |
| 3062 | + | |
| 3063 | + | |
| 3064 | + | |
| 3065 | + | |
| 3066 | + | |
| 3067 | + | |
| 3068 | + | |
| 3069 | + | |
| 3070 | + | |
| 3071 | + | |
| 3072 | + | |
| 3073 | + | |
| 3074 | + | |
| 3075 | + | |
| 3076 | + | |
| 3077 | + | |
| 3078 | + | |
| 3079 | + | |
| 3080 | + | |
| 3081 | + | |
| 3082 | + | |
| 3083 | + | |
| 3084 | + | |
| 3085 | + | |
| 3086 | + | |
| 3087 | + | |
| 3088 | + | |
| 3089 | + | |
| 3090 | + | |
| 3091 | + | |
| 3092 | + | |
| 3093 | + | |
| 3094 | + | |
| 3095 | + | |
| 3096 | + | |
| 3097 | + | |
| 3098 | + | |
| 3099 | + | |
| 3100 | + | |
| 3101 | + | |
| 3102 | + | |
| 3103 | + | |
| 3104 | + | |
| 3105 | + | |
| 3106 | + | |
| 3107 | + | |
| 3108 | + | |
| 3109 | + | |
| 3110 | + | |
| 3111 | + | |
| 3112 | + | |
| 3113 | + | |
| 3114 | + | |
| 3115 | + | |
| 3116 | + | |
| 3117 | + | |
| 3118 | + | |
| 3119 | + | |
| 3120 | + | |
| 3121 | + | |
| 3122 | + | |
| 3123 | + | |
| 3124 | + | |
| 3125 | + | |
| 3126 | + | |
| 3127 | + | |
| 3128 | + | |
| 3129 | + | |
| 3130 | + | |
| 3131 | + | |
| 3132 | + | |
| 3133 | + | |
| 3134 | + | |
| 3135 | + | |
| 3136 | + | |
| 3137 | + | |
| 3138 | + | |
| 3139 | + | |
| 3140 | + | |
| 3141 | + | |
| 3142 | + | |
| 3143 | + | |
| 3144 | + | |
| 3145 | + | |
2915 | 3146 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
476 | 476 | | |
477 | 477 | | |
478 | 478 | | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
479 | 499 | | |
480 | 500 | | |
481 | 501 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5035 | 5035 | | |
5036 | 5036 | | |
5037 | 5037 | | |
5038 | | - | |
5039 | | - | |
5040 | | - | |
5041 | | - | |
5042 | | - | |
5043 | | - | |
5044 | | - | |
5045 | | - | |
5046 | | - | |
5047 | 5038 | | |
5048 | 5039 | | |
5049 | 5040 | | |
| |||
5080 | 5071 | | |
5081 | 5072 | | |
5082 | 5073 | | |
5083 | | - | |
| 5074 | + | |
5084 | 5075 | | |
5085 | 5076 | | |
5086 | 5077 | | |
5087 | | - | |
5088 | | - | |
5089 | 5078 | | |
| 5079 | + | |
5090 | 5080 | | |
5091 | 5081 | | |
5092 | 5082 | | |
5093 | 5083 | | |
5094 | | - | |
| 5084 | + | |
5095 | 5085 | | |
5096 | | - | |
| 5086 | + | |
5097 | 5087 | | |
5098 | | - | |
| 5088 | + | |
| 5089 | + | |
| 5090 | + | |
| 5091 | + | |
| 5092 | + | |
| 5093 | + | |
| 5094 | + | |
| 5095 | + | |
| 5096 | + | |
| 5097 | + | |
| 5098 | + | |
| 5099 | + | |
| 5100 | + | |
| 5101 | + | |
5099 | 5102 | | |
5100 | | - | |
5101 | | - | |
5102 | | - | |
5103 | | - | |
5104 | | - | |
5105 | | - | |
| 5103 | + | |
| 5104 | + | |
| 5105 | + | |
| 5106 | + | |
| 5107 | + | |
| 5108 | + | |
| 5109 | + | |
| 5110 | + | |
| 5111 | + | |
| 5112 | + | |
| 5113 | + | |
| 5114 | + | |
| 5115 | + | |
| 5116 | + | |
| 5117 | + | |
| 5118 | + | |
| 5119 | + | |
| 5120 | + | |
| 5121 | + | |
| 5122 | + | |
| 5123 | + | |
| 5124 | + | |
| 5125 | + | |
| 5126 | + | |
| 5127 | + | |
| 5128 | + | |
| 5129 | + | |
| 5130 | + | |
| 5131 | + | |
| 5132 | + | |
| 5133 | + | |
| 5134 | + | |
| 5135 | + | |
| 5136 | + | |
| 5137 | + | |
| 5138 | + | |
5106 | 5139 | | |
5107 | | - | |
5108 | | - | |
5109 | | - | |
5110 | | - | |
5111 | | - | |
5112 | | - | |
5113 | 5140 | | |
5114 | 5141 | | |
5115 | 5142 | | |
| |||
0 commit comments