From 4164a222aeac06e362f7378ff6ae19e22a2a8fee Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 24 Nov 2025 18:47:14 -0600 Subject: [PATCH] Consolidate D3D11 constant buffers now that all shaders need a CSC constant buffer --- app/shaders/d3d11_ayuv_pixel.fxc | Bin 1508 -> 1356 bytes app/shaders/d3d11_y410_pixel.fxc | Bin 1508 -> 1356 bytes app/shaders/d3d11_yuv420_pixel.fxc | Bin 1740 -> 1644 bytes app/shaders/d3d11_yuv420_pixel.hlsl | 8 +--- app/shaders/d3d11_yuv444_pixel_end.hlsli | 3 +- app/shaders/d3d11_yuv444_pixel_start.hlsli | 8 +--- .../video/ffmpeg-renderers/d3d11va.cpp | 41 ++++-------------- 7 files changed, 14 insertions(+), 46 deletions(-) diff --git a/app/shaders/d3d11_ayuv_pixel.fxc b/app/shaders/d3d11_ayuv_pixel.fxc index 5fdf17a919221a28301d537618b346e85146a45e..0c1033a5e6e8b1aaf5ffcb34dcbb2c6bbbebea97 100644 GIT binary patch delta 649 zcmZWm&npCB7=FK*S=J(3(o$-6YZGy>*+hwNci9~LY)3heuJ+ZRfd55|LDaE1%iUW)qy)2GA>g6B=mb$^v zKZ;d8Eq~B9s&TTCL@MJ|CXsVNe#gQf=u(sMYg6UUsUMm+gLX{fj`gJ#SHttP=4wSm zSg33S`{tNthy<$^vy8{&$=ZoZcEdsRK_I@^?CB#4ywH!I4hD&dH>TIgu6h5j%5K<9 zaF`;d=#{dXhU5N6O#XBB6+QN+2LflKZj8@3+rW-kQ+2i{^7!V&rK*c(wI-WMO{Ip1GR9PLEKRnZlWTx0ULGpoIl6DLNdSChP5RLU%AA%WmBPM!NOlr_wn1dcS@23QtF;~OD zMRd?(13hF;xSILX4V!}xQDT^y8!`us4SGHfd6+SU!yeX&y;-@K^mm6tz|LjYUNdL{ zC{v$AHSH14vECX){%rv!jdud;GIKL7X{^mKwC($=tH9$p^!a$)dyOjTM@F1`c~sPS zr#!$d;N0$5+|RoUH-O1`_`NLE!*Y#Ly>!U}Q%5-NX$Ab3eqFE^snc!6lf7%vv6@}O zO`85~I&-X?zA(0r74o@KXOS!Wi7z7D%V*#UU%06=aOF+zafIz8oi2TTLr6?SEPtLO z3HBHT#+=h~r^UufMy_q;XJxK>MU*mG>ko@%{x7P0_ls17`Kw|42X&87-tVNyOwmu& zV1KC}QfR!~ByC^7DH7Cw`%g|d-Fnq7H@BZw+j!B~sRNj%k8h_RN zzYWUZD&93!_eSA8+F8a<_WQ`V$+&z2k*|th=~R}=-F8EU=$xUC&1ltXoocrOf0v?% zj(3r5eOYQ$+O1Bj)-@8Pt46M17Yw^z-m12ZbgQ}D;QJYKv)AX4w-@I&St6Ce9yz~- z_h!L$F%=WzjQNt6wRJ_bA8f1??YxsOF2l*LrHjQ(A5l3t1~kCfP>7y^58zZI3ZfogU+cX`U4oQS$pS?IMr~deMc(S=AOx1W z!O%a2RX(kF)IFtfvJylp;{lV%IU~PgVGwk=$@r70a_86&O`JhHCUM95(u%9$d0KO| zBEl?GF^PS1Ofy8B)rv*NBl2WDL}hy|LG(c&zStZXBC33)A3qfg5)T;Y7qbc literal 1508 zcma)5ziSh56n~dX+O!oC9HfKbAr28l+FC?W>^HgQnn2R4xvNB%G^PoO7_THzJIPUs zlZbynhZ7WqE*W&z!Ntu%cZG}&(p}=`-F+_&rAQyVzV~_W^L~9VT`p(z8^xzzcb~uY z_J%)x{{8sfQHW>|BbtQ030*|sa|FIhRDcTP-b2&Qqw9Z=XQjw+*oP79Qc8M)6uKaN z7zp=fVH=f5LG5j#Sd0=Lk-NnCP|k5X1c}tX^j}dt;h{c4BJRcndDBQLq`D*q9yaf1 z7>k6f(7>hmz(WHyA|_o${BomW@H!4mLUAKvfY`tbaKy)mNgVaD3hd9yCAhyk91>Z% zYAJAb>Bji5|>cYK1o#{v( z?|o)stY$}Z(;~P{MGloSr^og&A_14{3~+fr_F0&F{sdg+GdFVrF2BhwjIivq-Gh&B zNE~Bfi=XF6!aYWTG3U74aj~(Ik!uLp_p?xn;#Y(C7w8@! zzu!^enXK=i;r?7dguwW@DcC-PVP&NSXD?M5loHmXyRbe-0)V ztJ~aH!LJ(sw_zE%l6Ohgy^wehb`G(l{oWuh5a(~e@$G@?iW%zI45!iP z)_YwFb}@Z)xC?I^NU>GxI9;dF(^932TCQLfG^<(NtamisX>Yage%k!p<$20mEAtyD z;mUB2T+qUQv+%lvjIpuDe9rUQsw7%>Dr=^dxAW#I+1avgnx$pl&%~TX$qnbEj`U&3 PbGRS+*y++r)<*F^eL=g+ diff --git a/app/shaders/d3d11_yuv420_pixel.fxc b/app/shaders/d3d11_yuv420_pixel.fxc index 4285c1a9ee3614235b59934539a9dbbf11ad9153..793c1c278e99e3174a486d36faf114bb15d8dbf8 100644 GIT binary patch delta 557 zcmYL`ODJ_w7>3_<*~dvol7U1ya)}rixkYUbGI0w;JL zj?a_L0>FF($YO3G(=ZW$^q&)-?s3#Db6_yr0>5lH4=f^uxf-vd01QDHUj)S z2qFE5KS1rIQi)vcX7;iHC7?X*zNH>pTa}yHkJ5rGJn3dUu;ok3K#L!(1I?a2ZXw}D zJ;#iTg2Goy7r+{siwZFc=&r3eV0Oi_fXS0ZIZvB$PuM1gHcisd|1WDeegtEMvh{#E zuDIuF_7`q#Cn+Y-zHiMVvO}rNzREW(Iw}rLr!Em^Cdu*AT&n`>nhRaKKA4zD^z{x7 zO|%bpA)QWN+GWT)=_lXOZ#QGu>y%_H)bq@B)UnWC3H=RbmmcpZ=-&?g1Lp2uUt-&w oIyJch^*lKr^efDRQyQC^U0V1vIh0)OnOrr#Q>}PBQx!S*1ohx(G5`Po delta 638 zcmZ8eJ4hT+6g_V~>uyjKEw)jd!hoWM_ybX4+*uX`O%zu!Bq$;#3Vzlf*zE|~it-98 zLBVb-F=dK$v9PdG8@mMsEs{nQgvq(HvyFGSpL5=Q_ue=6sq(TapPo#4-pf^R*!Ok) z$6`MF`1)^30l16-74-eo9ElAR_)CQaH1lkqI=Hgj+r~3d7(wtrmzEH1QIuxf6vcqz zCsMMZuZ3MESzrvXV+Xrlwe1#BB7^+zbp@Zt)~e3a;`Ex9BUTl&}$EauK#d zY!b7P0XOc)^q5K}-UwX)dA+LYs$_^Sd`@Q1fzsP*y+s(l4xK=v12v3*OxgPmJBAdX z8w{Fec^6$J9k7wRuUQ*WDf+Ogv5k8ZIV)wLd? zy(gOt+2``P-m%*A^J^+={sNJoQKD>CF8+@26@5GL`+~RR YUGiK}nE#-=?N*($9erds>kIqzKX_wr1^@s6 diff --git a/app/shaders/d3d11_yuv420_pixel.hlsl b/app/shaders/d3d11_yuv420_pixel.hlsl index 9b68b400..487a1f08 100644 --- a/app/shaders/d3d11_yuv420_pixel.hlsl +++ b/app/shaders/d3d11_yuv420_pixel.hlsl @@ -8,16 +8,12 @@ struct ShaderInput float2 tex : TEXCOORD0; }; -cbuffer ChromaLimitBuf : register(b0) -{ - min16float3 chromaTexMax; -}; - -cbuffer CSC_CONST_BUF : register(b1) +cbuffer CSC_CONST_BUF : register(b0) { min16float3x3 cscMatrix; min16float3 offsets; min16float2 chromaOffset; + min16float2 chromaTexMax; }; min16float4 main(ShaderInput input) : SV_TARGET diff --git a/app/shaders/d3d11_yuv444_pixel_end.hlsli b/app/shaders/d3d11_yuv444_pixel_end.hlsli index 163109ce..961c01a9 100644 --- a/app/shaders/d3d11_yuv444_pixel_end.hlsli +++ b/app/shaders/d3d11_yuv444_pixel_end.hlsli @@ -1,7 +1,6 @@ min16float4 main(ShaderInput input) : SV_TARGET { - // Clamp the texcoords to avoid sampling the row of texels adjacent to the alignment padding - min16float3 yuv = swizzle(videoTex.Sample(theSampler, min(input.tex, chromaTexMax.rg))); + min16float3 yuv = swizzle(videoTex.Sample(theSampler, input.tex)); // Subtract the YUV offset for limited vs full range yuv -= offsets; diff --git a/app/shaders/d3d11_yuv444_pixel_start.hlsli b/app/shaders/d3d11_yuv444_pixel_start.hlsli index 5697526c..a34e00b3 100644 --- a/app/shaders/d3d11_yuv444_pixel_start.hlsli +++ b/app/shaders/d3d11_yuv444_pixel_start.hlsli @@ -7,14 +7,10 @@ struct ShaderInput float2 tex : TEXCOORD0; }; -cbuffer ChromaLimitBuf : register(b0) -{ - min16float3 chromaTexMax; -}; - -cbuffer CSC_CONST_BUF : register(b1) +cbuffer CSC_CONST_BUF : register(b0) { min16float3x3 cscMatrix; min16float3 offsets; min16float2 chromaOffset; // Unused for 4:4:4 + min16float2 chromaTexMax; // Unused for 4:4:4 }; \ No newline at end of file diff --git a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp index 773ec023..c8401c23 100644 --- a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp +++ b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp @@ -43,8 +43,8 @@ typedef struct _CSC_CONST_BUF // Chroma offset values float chromaOffset[2]; - // Padding to final 16-byte boundary - float padding2[2]; + // Max UV coordinates to avoid sampling alignment padding + float chromaUVMax[2]; } CSC_CONST_BUF, *PCSC_CONST_BUF; static_assert(sizeof(CSC_CONST_BUF) % 16 == 0, "Constant buffer sizes must be a multiple of 16"); @@ -740,13 +740,19 @@ void D3D11VARenderer::bindColorConversion(AVFrame* frame) constBuf.chromaOffset[0] = chromaOffset[0] / m_TextureWidth; constBuf.chromaOffset[1] = chromaOffset[1] / m_TextureHeight; + // Limit chroma texcoords to avoid sampling from alignment texels + constBuf.chromaUVMax[0] = m_DecoderParams.width != (int)m_TextureWidth ? + ((float)(m_DecoderParams.width - 1) / m_TextureWidth) : 1.0f; + constBuf.chromaUVMax[1] = m_DecoderParams.height != (int)m_TextureHeight ? + ((float)(m_DecoderParams.height - 1) / m_TextureHeight) : 1.0f; + D3D11_SUBRESOURCE_DATA constData = {}; constData.pSysMem = &constBuf; ComPtr constantBuffer; HRESULT hr = m_Device->CreateBuffer(&constDesc, &constData, &constantBuffer); if (SUCCEEDED(hr)) { - m_DeviceContext->PSSetConstantBuffers(1, 1, constantBuffer.GetAddressOf()); + m_DeviceContext->PSSetConstantBuffers(0, 1, constantBuffer.GetAddressOf()); } else { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, @@ -1371,35 +1377,6 @@ bool D3D11VARenderer::setupRenderingResources() } } - // Create our fixed constant buffer to limit chroma texcoords and avoid sampling from alignment texels. - { - D3D11_BUFFER_DESC constDesc = {}; - constDesc.ByteWidth = sizeof(CSC_CONST_BUF); - constDesc.Usage = D3D11_USAGE_IMMUTABLE; - constDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - constDesc.CPUAccessFlags = 0; - constDesc.MiscFlags = 0; - - float chromaUVMax[3] = {}; - chromaUVMax[0] = m_DecoderParams.width != (int)m_TextureWidth ? ((float)(m_DecoderParams.width - 1) / m_TextureWidth) : 1.0f; - chromaUVMax[1] = m_DecoderParams.height != (int)m_TextureHeight ? ((float)(m_DecoderParams.height - 1) / m_TextureHeight) : 1.0f; - - D3D11_SUBRESOURCE_DATA constData = {}; - constData.pSysMem = chromaUVMax; - - ComPtr constantBuffer; - HRESULT hr = m_Device->CreateBuffer(&constDesc, &constData, &constantBuffer); - if (SUCCEEDED(hr)) { - m_DeviceContext->PSSetConstantBuffers(0, 1, constantBuffer.GetAddressOf()); - } - else { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, - "ID3D11Device::CreateBuffer() failed: %x", - hr); - return false; - } - } - // Create our blend state { D3D11_BLEND_DESC blendDesc = {};