From 6853a635f54e4d4f3fd3625ef1cabd3d477f9542 Mon Sep 17 00:00:00 2001 From: Eric Mellino Date: Thu, 26 Mar 2020 23:20:44 -0700 Subject: [PATCH] Add a RenderTest which writes custom values via gl_FragDepth. --- src/Veldrid.Tests/RenderTests.cs | 61 ++++++++++++++++++ .../FullScreenTriSampleTexture2D.frag.spv | Bin 0 -> 676 bytes .../FullScreenTriSampleTexture2D.vert.spv | Bin 0 -> 1336 bytes .../Shaders/FullScreenWriteDepth.frag | 17 +++++ .../Shaders/FullScreenWriteDepth.frag.spv | Bin 0 -> 1352 bytes .../Shaders/FullScreenWriteDepth.vert | 12 ++++ .../Shaders/FullScreenWriteDepth.vert.spv | Bin 0 -> 1424 bytes src/Veldrid.Tests/TestUtils.cs | 1 + src/Veldrid.Tests/Veldrid.Tests.csproj | 2 + 9 files changed, 93 insertions(+) create mode 100644 src/Veldrid.Tests/Shaders/FullScreenTriSampleTexture2D.frag.spv create mode 100644 src/Veldrid.Tests/Shaders/FullScreenTriSampleTexture2D.vert.spv create mode 100644 src/Veldrid.Tests/Shaders/FullScreenWriteDepth.frag create mode 100644 src/Veldrid.Tests/Shaders/FullScreenWriteDepth.frag.spv create mode 100644 src/Veldrid.Tests/Shaders/FullScreenWriteDepth.vert create mode 100644 src/Veldrid.Tests/Shaders/FullScreenWriteDepth.vert.spv diff --git a/src/Veldrid.Tests/RenderTests.cs b/src/Veldrid.Tests/RenderTests.cs index 904b41737..b16e636df 100644 --- a/src/Veldrid.Tests/RenderTests.cs +++ b/src/Veldrid.Tests/RenderTests.cs @@ -1180,6 +1180,67 @@ public void RenderToCubemapFace(uint layerCount, uint targetLayer, uint targetFa } GD.Unmap(staging, (targetLayer * 6) + targetFace); } + + [Fact] + public void WriteFragmentDepth() + { + Texture depthTarget = RF.CreateTexture( + TextureDescription.Texture2D(64, 64, 1, 1, PixelFormat.R32_Float, TextureUsage.DepthStencil | TextureUsage.Sampled)); + Framebuffer framebuffer = RF.CreateFramebuffer(new FramebufferDescription(depthTarget)); + + string setName = "FullScreenWriteDepth"; + ShaderSetDescription shaderSet = new ShaderSetDescription( + Array.Empty(), + TestShaders.LoadVertexFragment(RF, setName)); + + ResourceLayout layout = RF.CreateResourceLayout(new ResourceLayoutDescription( + new ResourceLayoutElementDescription("FramebufferInfo", ResourceKind.UniformBuffer, ShaderStages.Fragment))); + + DeviceBuffer ub = RF.CreateBuffer(new BufferDescription(16, BufferUsage.UniformBuffer)); + GD.UpdateBuffer(ub, 0, new Vector4(depthTarget.Width, depthTarget.Height, 0, 0)); + ResourceSet rs = RF.CreateResourceSet(new ResourceSetDescription(layout, ub)); + + GraphicsPipelineDescription gpd = new GraphicsPipelineDescription( + BlendStateDescription.SingleOverrideBlend, + new DepthStencilStateDescription(true, true, ComparisonKind.Always), + RasterizerStateDescription.CullNone, + PrimitiveTopology.TriangleList, + shaderSet, + layout, + framebuffer.OutputDescription); + + Pipeline pipeline = RF.CreateGraphicsPipeline(ref gpd); + + CommandList cl = RF.CreateCommandList(); + + cl.Begin(); + cl.SetFramebuffer(framebuffer); + cl.SetFullViewports(); + cl.SetFullScissorRects(); + cl.ClearDepthStencil(0f); + cl.SetPipeline(pipeline); + cl.SetGraphicsResourceSet(0, rs); + cl.Draw(3); + cl.End(); + GD.SubmitCommands(cl); + GD.WaitForIdle(); + + Texture readback = GetReadback(depthTarget); + + MappedResourceView readView = GD.Map(readback, MapMode.Read); + for (uint y = 0; y < readback.Height; y++) + { + for (uint x = 0; x < readback.Width; x++) + { + float xComp = x; + float yComp = y * readback.Width; + float val = (yComp + xComp) / (readback.Width * readback.Height); + + Assert.Equal(val, readView[x, y], 2); + } + } + GD.Unmap(readback); + } } #if TEST_OPENGL diff --git a/src/Veldrid.Tests/Shaders/FullScreenTriSampleTexture2D.frag.spv b/src/Veldrid.Tests/Shaders/FullScreenTriSampleTexture2D.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..86a0ff6fa3b05809fc963fc10518378bbc529ed6 GIT binary patch literal 676 zcmYk3K}$kW5QV4gsby(qX%>XmURqQHQJWTS+*!7ipadZ`(xBhhuWA$YeNQDv#<_Fu znK?7}W!BGf5o?j>SC6@sV;v--5ZN@gJKaueI(undT%OA)MkXc7DMcp=-o9MG5FCKS9Tu!F2LD>)%h_CLgIzLd`b#!|N9{8Tv(ZNAGF9{Rh+G zxc}ITHr=d0!8LR1PSfl^Z?5F_TD>>--kq$s|FU0&$(_BKZV~CZ$~gyO(yv6h)%EQi}Lp<~(!v(T-8vBih3` z_lfGdkF^IxHO191cXzQXURs_zY0mxwk`Qk}?YV literal 0 HcmV?d00001 diff --git a/src/Veldrid.Tests/Shaders/FullScreenTriSampleTexture2D.vert.spv b/src/Veldrid.Tests/Shaders/FullScreenTriSampleTexture2D.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..bf5c075db72c304a42e40f23ef36afb74a6903cc GIT binary patch literal 1336 zcmZ9M+e=hY6o+?nv$8ZZwTs!YvFp@yk045-U(Rio(@X=i( zrb4|4G-jGSPXqa|mF4OukVT|})cL7#{~)+Y)Zw@$KC}0bCS2ydA8c--j zFy;*S=OU(2)O|O~^3As!Mb3>fr=RYYX_!=M1#u7c`omE+&W1VYM1k9PfoJ)6J^PXx z7k&1M@8ux-_$nKXxAN`uz~`&=eHsi7eD>!%Jw0CM8zzyPmF*ms5YKBmj(r*9iC8&r zH}Ma%7vtoOaq42uv4_Wc#?A8Edl}3a^?9@wcTz}$*M~yHI#lpJhJ>*HeGdCLT7uX^ zf-R4__|wYvePZT|PyJ_~!j^jh|9NgXw5@l6+up>jr|o>iVn5}q_E)2w;Nz^?-({3U zi=$t=U07xP6?ALKDgV_2;=f+`#g@o&mN7@4V&Cr4y87)~yHjD-bq==> zPwe|nX%_kS(9O5@W4;0BVNV|M-yltHYr7-=CcLBV_pkk|;yQ`$9)6J}_cS8rE`CA*07|?`-2coZ}h8CO9OG-=BH)BlvUH&Rx zOkC@nv++E*o9WE=&27(|T`bg2g)kN-_^pNX%!UF?2$P|l=&kMD?fTJhzrObLp%GJ| zm;@R#Owo1I1%~$aeSxojgIw|lX?e-dz*vC z!A7q)*vFOR%%MMT^g8_vUqpX7!R2rjOj4)$anx!x2k*MA9@SDFSJ)X1`=jA*`)kvB z#jqsF(Y}d3ZX724oh9r4rr95UN@GgNe66E)cklg&u*C$?)+ z@9rMGkJ$O;tbH9_LCm#w#K0uKiZ(XgNhv(Qc2{ESiQTcB{T`#O<^A=G-MQQ|=Czi) z@|g1*W*lv-yY37F+)e@`~Ho zTW%e{y?rxs?%Mj!yoksf@7=^P{xY`lev24?1zUcd>?(R0asL%0U$+L<_k-T{xq+A~ zZ!hPTi*;{d%SC(}+xvXW^6y|9BOiO;#r|LKd+_>V+)6GkKg%k-zIey`*yhUr%=*@` a?XAyy`+el%Js)Aq>GR!)|L|3wBYy!8!ACOy literal 0 HcmV?d00001 diff --git a/src/Veldrid.Tests/Shaders/FullScreenWriteDepth.vert b/src/Veldrid.Tests/Shaders/FullScreenWriteDepth.vert new file mode 100644 index 000000000..0983cf2a5 --- /dev/null +++ b/src/Veldrid.Tests/Shaders/FullScreenWriteDepth.vert @@ -0,0 +1,12 @@ +#version 450 + +layout(location = 0) out vec2 fsin_UV; + +void main() +{ + float x = -1.0 + float((gl_VertexIndex & 1) << 2); + float y = -1.0 + float((gl_VertexIndex & 2) << 1); + fsin_UV.x = (x + 1.0) * 0.5; + fsin_UV.y = (y + 1.0) * 0.5; + gl_Position = vec4(x, y, 0, 1); +} diff --git a/src/Veldrid.Tests/Shaders/FullScreenWriteDepth.vert.spv b/src/Veldrid.Tests/Shaders/FullScreenWriteDepth.vert.spv new file mode 100644 index 0000000000000000000000000000000000000000..acb8788350990a0fdae8d8bf2589ae39c25a3b2e GIT binary patch literal 1424 zcmZ9LTTc^F6on6^Eh-8k0$vaY>lL)#08NY%BS|&kp$U;!LZq5W>eSGhpilVV?=mqa z{v}^b{Jxnv(0H2Fv)9`D?7h!rMk|f65JtiYeosO%ra}cJgz-?%=ho)dX0t!oYp$$5 zFk&K%=7Gjcvd&QjA9vGC`!tvb_rWN?3iD5bYeWsl)$qCc0Mw}Ex)0r*?auz7bMPkH z>)X-R_ak{@kad#qQk0I9MvV=db`Aujx4UWsD!tl@R-lIY5tuT(Tvfa#i}zWIjZbFgJPsK5DU_;;atWBTw)#*6r^a zMj~VAmp5`&uDCz_cYyuc&vNPW?B?NjOK!{pt31mXqfgj(li9rb?OR^F?c;OE zKMeHP_hW2_>sOhJJ%+Hx8}K~r!J+;KrN(S-@5pb$Idb2>{5gKl{0#6OezQtGS!&+J zuTq;Tb?>9cI?v=BQ2$1Zd>VNF>M!WTx@xh`4EAuHS-6@xW1Tr{b!*2u7qHc1or~Dk zQMZo!QL~PHTmjaO@mEXDxA48}brD-V0WZl?uL(*Wj`8yEB5#I{zPx# literal 0 HcmV?d00001 diff --git a/src/Veldrid.Tests/TestUtils.cs b/src/Veldrid.Tests/TestUtils.cs index 780db2546..1f95dab21 100644 --- a/src/Veldrid.Tests/TestUtils.cs +++ b/src/Veldrid.Tests/TestUtils.cs @@ -174,6 +174,7 @@ public GraphicsDeviceTestBase() if (Environment.GetEnvironmentVariable("VELDRID_TESTS_ENABLE_RENDERDOC") == "1" && RenderDoc.Load(out _renderDoc)) { + _renderDoc.APIValidation = true; _renderDoc.DebugOutputMute = false; } Activator.CreateInstance().CreateGraphicsDevice(out _window, out _gd); diff --git a/src/Veldrid.Tests/Veldrid.Tests.csproj b/src/Veldrid.Tests/Veldrid.Tests.csproj index 8b863f8d3..92c0d5468 100644 --- a/src/Veldrid.Tests/Veldrid.Tests.csproj +++ b/src/Veldrid.Tests/Veldrid.Tests.csproj @@ -46,6 +46,8 @@ + +