diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2019-10-18 01:26:07 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2019-10-18 01:26:07 +0000 |
| commit | 085e1e07fe61386e46395fa06deee96479f44f5a (patch) | |
| tree | 6e11d0406f72548fe697bb448ea23814b4c3fecd /Projects/Asteroids/src | |
| parent | Updated readme (diff) | |
| download | DiligentEngine-085e1e07fe61386e46395fa06deee96479f44f5a.tar.gz DiligentEngine-085e1e07fe61386e46395fa06deee96479f44f5a.zip | |
Asteroids demo: enabled bindless mode in DiligentD3D12 and DiligentVk modes
Diffstat (limited to 'Projects/Asteroids/src')
| -rw-r--r-- | Projects/Asteroids/src/WinWrapper.cpp | 9 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroid_ps_d3d11.hlsl | 41 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroid_ps_diligent.hlsl | 72 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroid_vs.hlsl | 3 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroids_DE.cpp | 61 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroids_DE.h | 18 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroids_d3d11.h | 1 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroids_d3d12.h | 1 | ||||
| -rw-r--r-- | Projects/Asteroids/src/settings.h | 2 |
9 files changed, 157 insertions, 51 deletions
diff --git a/Projects/Asteroids/src/WinWrapper.cpp b/Projects/Asteroids/src/WinWrapper.cpp index e60480f..fd126b4 100644 --- a/Projects/Asteroids/src/WinWrapper.cpp +++ b/Projects/Asteroids/src/WinWrapper.cpp @@ -208,7 +208,7 @@ LRESULT CALLBACK WindowProc( return 0; case 'B': if (gSettings.mode == Settings::RenderMode::DiligentD3D12 || gSettings.mode == Settings::RenderMode::DiligentVulkan) { - gSettings.resourceBindingMode = (gSettings.resourceBindingMode + 1) % 3; + gSettings.resourceBindingMode = (gSettings.resourceBindingMode + 1) % 4; gUpdateWorkload = true; } return 0; @@ -602,9 +602,10 @@ int main(int argc, char** argv) gWorkloadDE->GetPerfCounters(updateTime, renderTime); switch (gSettings.resourceBindingMode) { - case 0: resBindModeStr = "-d";break; - case 1: resBindModeStr = "-m";break; - case 2: resBindModeStr = "-tm";break; + case 0: resBindModeStr = "-dyn";break; + case 1: resBindModeStr = "-mut";break; + case 2: resBindModeStr = "-tex_mut";break; + case 3: resBindModeStr = "-bindless";break; } break; } diff --git a/Projects/Asteroids/src/asteroid_ps_d3d11.hlsl b/Projects/Asteroids/src/asteroid_ps_d3d11.hlsl index 27fd72a..f4987c9 100644 --- a/Projects/Asteroids/src/asteroid_ps_d3d11.hlsl +++ b/Projects/Asteroids/src/asteroid_ps_d3d11.hlsl @@ -1,18 +1,11 @@ +#include "asteroid_vs.hlsl" #include "common_defines.h" -struct VSOut -{ - float3 positionModel : POSITIONMODEL; - float3 normalWorld : NORMAL; - float3 albedo : ALBEDO; // Alternatively, can pass just "ao" to PS and read cbuffer in PS -}; - -Texture2DArray<float4> Tex;// : register(t0); -SamplerState Tex_sampler;// : register(s0); +Texture2DArray<float4> Tex : register(t0); +sampler Sampler : register(s0); -void asteroid_ps_d3d11(in float4 position : SV_Position, - in VSOut vs_output, - out float4 color : SV_Target) +float4 asteroid_ps_d3d11(in float4 position : SV_Position, + VSOut input) : SV_Target { // Tweaking float3 lightPos = float3(0.5, -0.25, -1); @@ -20,11 +13,11 @@ void asteroid_ps_d3d11(in float4 position : SV_Position, bool applyLight = true; bool applyCoverage = true; - float3 normal = normalize(vs_output.normalWorld); + float3 normal = normalize(input.normalWorld); // Triplanar projection - float3 blendWeights = abs(normalize(vs_output.positionModel)); - float3 uvw = vs_output.positionModel * 0.5f + 0.5f; + float3 blendWeights = abs(normalize(input.positionModel)); + float3 uvw = input.positionModel * 0.5f + 0.5f; // Tighten up the blending zone blendWeights = saturate((blendWeights - 0.2f) * 7.0f); blendWeights /= (blendWeights.x + blendWeights.y + blendWeights.z).xxx; @@ -36,10 +29,10 @@ void asteroid_ps_d3d11(in float4 position : SV_Position, // TODO: Should really branch out zero'd weight ones, but FXC is being a pain // and forward substituting the above and then refusing to compile "divergent" // coordinates... - float3 detailTex = float3(0.0, 0.0, 0.0); - detailTex += blendWeights.x * Tex.Sample(Tex_sampler, coords1).xyz; - detailTex += blendWeights.y * Tex.Sample(Tex_sampler, coords2).xyz; - detailTex += blendWeights.z * Tex.Sample(Tex_sampler, coords3).xyz; + float3 detailTex = 0.0f; + detailTex += blendWeights.x * Tex.Sample(Sampler, coords1).xyz; + detailTex += blendWeights.y * Tex.Sample(Sampler, coords2).xyz; + detailTex += blendWeights.z * Tex.Sample(Sampler, coords3).xyz; float wrap = 0.0f; float wrap_diffuse = saturate((dot(normal, normalize(lightPos)) + wrap) / (1.0f + wrap)); @@ -48,9 +41,9 @@ void asteroid_ps_d3d11(in float4 position : SV_Position, // Approximate partial coverage on distant asteroids (by fading them out) float coverage = saturate(position.z * 4000.0f); - color.rgb = vs_output.albedo.rgb; - [flatten] if (applyNoise) color.rgb = color.rgb * (2.0f * detailTex); - [flatten] if (applyLight) color.rgb = color.rgb * light; - [flatten] if (applyCoverage) color.rgb = color.rgb * coverage; - color.a = 1.0; + float3 color = input.albedo; + [flatten] if (applyNoise) color = color * (2.0f * detailTex); + [flatten] if (applyLight) color = color * light; + [flatten] if (applyCoverage) color = color * coverage; + return float4(color, 1.0f); } diff --git a/Projects/Asteroids/src/asteroid_ps_diligent.hlsl b/Projects/Asteroids/src/asteroid_ps_diligent.hlsl new file mode 100644 index 0000000..c2f6f0b --- /dev/null +++ b/Projects/Asteroids/src/asteroid_ps_diligent.hlsl @@ -0,0 +1,72 @@ +#include "common_defines.h" + +struct VSOut +{ + float3 positionModel : POSITIONMODEL; + float3 normalWorld : NORMAL; + float3 albedo : ALBEDO; // Alternatively, can pass just "ao" to PS and read cbuffer in PS + uint textureId : TEXTURE_ID; +}; + +#ifdef BINDLESS + +Texture2DArray<float4> Tex[NUM_UNIQUE_TEXTURES]; +SamplerState Tex_sampler; + +#else + +Texture2DArray<float4> Tex; +SamplerState Tex_sampler; + +#endif + +void asteroid_ps_diligent(in float4 position : SV_Position, + in VSOut vs_output, + out float4 color : SV_Target) +{ + // Tweaking + float3 lightPos = float3(0.5, -0.25, -1); + bool applyNoise = true; + bool applyLight = true; + bool applyCoverage = true; + + float3 normal = normalize(vs_output.normalWorld); + + // Triplanar projection + float3 blendWeights = abs(normalize(vs_output.positionModel)); + float3 uvw = vs_output.positionModel * 0.5f + 0.5f; + // Tighten up the blending zone + blendWeights = saturate((blendWeights - 0.2f) * 7.0f); + blendWeights /= (blendWeights.x + blendWeights.y + blendWeights.z).xxx; + + float3 coords1 = float3(uvw.yz, 0); + float3 coords2 = float3(uvw.zx, 1); + float3 coords3 = float3(uvw.xy, 2); + + // TODO: Should really branch out zero'd weight ones, but FXC is being a pain + // and forward substituting the above and then refusing to compile "divergent" + // coordinates... + float3 detailTex = float3(0.0, 0.0, 0.0); +#ifdef BINDLESS + detailTex += blendWeights.x * Tex[vs_output.textureId].Sample(Tex_sampler, coords1).xyz; + detailTex += blendWeights.y * Tex[vs_output.textureId].Sample(Tex_sampler, coords2).xyz; + detailTex += blendWeights.z * Tex[vs_output.textureId].Sample(Tex_sampler, coords3).xyz; +#else + detailTex += blendWeights.x * Tex.Sample(Tex_sampler, coords1).xyz; + detailTex += blendWeights.y * Tex.Sample(Tex_sampler, coords2).xyz; + detailTex += blendWeights.z * Tex.Sample(Tex_sampler, coords3).xyz; +#endif + + float wrap = 0.0f; + float wrap_diffuse = saturate((dot(normal, normalize(lightPos)) + wrap) / (1.0f + wrap)); + float light = 3.0f * wrap_diffuse + 0.06f; + + // Approximate partial coverage on distant asteroids (by fading them out) + float coverage = saturate(position.z * 4000.0f); + + color.rgb = vs_output.albedo.rgb; + [flatten] if (applyNoise) color.rgb = color.rgb * (2.0f * detailTex); + [flatten] if (applyLight) color.rgb = color.rgb * light; + [flatten] if (applyCoverage) color.rgb = color.rgb * coverage; + color.a = 1.0; +} diff --git a/Projects/Asteroids/src/asteroid_vs.hlsl b/Projects/Asteroids/src/asteroid_vs.hlsl index 772137c..f19fe2c 100644 --- a/Projects/Asteroids/src/asteroid_vs.hlsl +++ b/Projects/Asteroids/src/asteroid_vs.hlsl @@ -12,6 +12,7 @@ struct VSOut float3 positionModel : POSITIONMODEL; float3 normalWorld : NORMAL; float3 albedo : ALBEDO; // Alternatively, can pass just "ao" to PS and read cbuffer in PS + uint textureId : TEXTURE_ID; }; float linstep(float min, float max, float s) @@ -33,4 +34,6 @@ void asteroid_vs(in float3 in_pos : ATTRIB0, float depth = linstep(0.5f, 0.7f, length(in_pos.xyz)); vs_output.albedo = lerp(mDeepColor.xyz, mSurfaceColor.xyz, depth); + + vs_output.textureId = mTextureIndex; } diff --git a/Projects/Asteroids/src/asteroids_DE.cpp b/Projects/Asteroids/src/asteroids_DE.cpp index 240287f..3cafba9 100644 --- a/Projects/Asteroids/src/asteroids_DE.cpp +++ b/Projects/Asteroids/src/asteroids_DE.cpp @@ -73,6 +73,23 @@ namespace Diligent namespace AsteroidsDE { +struct DrawConstantBuffer { + DirectX::XMFLOAT4X4 mWorld; + DirectX::XMFLOAT4X4 mViewProjection; + DirectX::XMFLOAT3 mSurfaceColor; + float unused0; + + DirectX::XMFLOAT3 mDeepColor; + float unused1; + + Uint32 mTextureIndex; + Uint32 unused3[3]; +}; + +struct SkyboxConstantBuffer { + DirectX::XMFLOAT4X4 mViewProjection; +}; + // Create Direct3D device and swap chain void Asteroids::InitDevice(HWND hWnd, DeviceType DevType) @@ -190,10 +207,12 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G mNumSubsets = std::max(settings.numThreads,1); mNumSubsets = std::min(settings.numThreads,32); + InitDevice(hWnd, DevType); + m_BindingMode = static_cast<BindingMode>(settings.resourceBindingMode); + if (m_BindingMode == BindingMode::Bindless && !mDevice->GetDeviceCaps().bBindlessSupported) + m_BindingMode = BindingMode::TextureMutable; - InitDevice(hWnd, DevType); - mCmdLists.resize(mDeferredCtxt.size()); mWorkerThreads.resize(mNumSubsets-1); for(auto &thread : mWorkerThreads) @@ -261,12 +280,23 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G ShaderCreateInfo attribs; attribs.Desc.ShaderType = SHADER_TYPE_PIXEL; attribs.Desc.Name = "Asteroids PS"; - attribs.EntryPoint = "asteroid_ps_d3d11"; - attribs.FilePath = "asteroid_ps_d3d11.hlsl"; + attribs.EntryPoint = "asteroid_ps_diligent"; + attribs.FilePath = "asteroid_ps_diligent.hlsl"; attribs.pShaderSourceStreamFactory = pShaderSourceFactory; attribs.UseCombinedTextureSamplers = true; attribs.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL; - mDevice->CreateShader(attribs, &ps); + + if(m_BindingMode == BindingMode::Bindless) + { + ShaderMacro Macros[] = {{"BINDLESS", "1"}, {}}; + attribs.Macros = Macros; + mDevice->CreateShader(attribs, &ps); + attribs.Macros = nullptr; + } + else + { + mDevice->CreateShader(attribs, &ps); + } } StaticSamplerDesc samDesc; @@ -318,6 +348,10 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G PSODesc.SRBAllocationGranularity = NUM_UNIQUE_TEXTURES; NumSRBs = NUM_UNIQUE_TEXTURES; } + else if(m_BindingMode == BindingMode::Bindless) + { + NumSRBs = 1; + } mDevice->CreatePipelineState(PSODesc, &mAsteroidsPSO); mAsteroidsPSO->GetStaticVariableByName(SHADER_TYPE_VERTEX, "DrawConstantBuffer")->Set(mDrawConstantBuffer); @@ -525,6 +559,13 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G mAsteroidsSRBs[srb]->GetVariableByName(SHADER_TYPE_PIXEL, "Tex")->Set(mTextureSRVs[srb]); } } + else if( m_BindingMode == BindingMode::Bindless ) + { + IDeviceObject* SRVArray[NUM_UNIQUE_TEXTURES]; + for(Uint32 t = 0; t < NUM_UNIQUE_TEXTURES; ++t) + SRVArray[t] = mTextureSRVs[t]; + mAsteroidsSRBs[0]->GetVariableByName(SHADER_TYPE_PIXEL, "Tex")->SetArray(SRVArray, 0, NUM_UNIQUE_TEXTURES); + } mDeviceCtxt->TransitionResourceStates(static_cast<Uint32>(Barriers.size()), Barriers.data()); } @@ -756,6 +797,11 @@ void Asteroids::RenderSubset(Diligent::Uint32 SubsetNum, } auto pVar = m_BindingMode == BindingMode::Dynamic ? mAsteroidsSRBs[SubsetNum]->GetVariableByName(SHADER_TYPE_PIXEL, "Tex") : nullptr; + if( m_BindingMode == BindingMode::Bindless) + { + pCtx->CommitShaderResources(mAsteroidsSRBs[0], RESOURCE_STATE_TRANSITION_MODE_VERIFY); + } + auto viewProjection = camera.ViewProjection(); for (UINT drawIdx = startIdx; drawIdx < startIdx+numAsteroids; ++drawIdx) { @@ -768,15 +814,16 @@ void Asteroids::RenderSubset(Diligent::Uint32 SubsetNum, XMStoreFloat4x4(&drawConstants->mViewProjection, viewProjection); drawConstants->mSurfaceColor = staticData->surfaceColor; drawConstants->mDeepColor = staticData->deepColor; + drawConstants->mTextureIndex = staticData->textureIndex; } if( m_BindingMode == BindingMode::Dynamic ) { pVar->Set(mTextureSRVs[staticData->textureIndex]); - pCtx->CommitShaderResources(mAsteroidsSRBs[SubsetNum], RESOURCE_STATE_TRANSITION_MODE_TRANSITION); + pCtx->CommitShaderResources(mAsteroidsSRBs[SubsetNum], RESOURCE_STATE_TRANSITION_MODE_VERIFY); } else if( m_BindingMode == BindingMode::Mutable ) { - pCtx->CommitShaderResources(mAsteroidsSRBs[drawIdx], RESOURCE_STATE_TRANSITION_MODE_TRANSITION); + pCtx->CommitShaderResources(mAsteroidsSRBs[drawIdx], RESOURCE_STATE_TRANSITION_MODE_VERIFY); } else if( m_BindingMode == BindingMode::TextureMutable ) { diff --git a/Projects/Asteroids/src/asteroids_DE.h b/Projects/Asteroids/src/asteroids_DE.h index 4029cc3..60a56cc 100644 --- a/Projects/Asteroids/src/asteroids_DE.h +++ b/Projects/Asteroids/src/asteroids_DE.h @@ -28,19 +28,6 @@ namespace AsteroidsDE { -struct DrawConstantBuffer { - DirectX::XMFLOAT4X4 mWorld; - DirectX::XMFLOAT4X4 mViewProjection; - DirectX::XMFLOAT3 mSurfaceColor; - float unused0; - DirectX::XMFLOAT3 mDeepColor; - float unused1; -}; - -struct SkyboxConstantBuffer { - DirectX::XMFLOAT4X4 mViewProjection; -}; - class Asteroids { public: Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, GUI* gui, HWND hWnd, Diligent::DeviceType DevType); @@ -62,8 +49,9 @@ private: enum class BindingMode { Dynamic = 0, - Mutable = 1, - TextureMutable = 2 + Mutable, + TextureMutable, + Bindless }m_BindingMode = BindingMode::TextureMutable; AsteroidsSimulation* mAsteroids = nullptr; diff --git a/Projects/Asteroids/src/asteroids_d3d11.h b/Projects/Asteroids/src/asteroids_d3d11.h index da9548e..8d672a9 100644 --- a/Projects/Asteroids/src/asteroids_d3d11.h +++ b/Projects/Asteroids/src/asteroids_d3d11.h @@ -31,6 +31,7 @@ struct DrawConstantBuffer { float unused0; DirectX::XMFLOAT3 mDeepColor; float unused1; + UINT unused2[4]; }; struct SkyboxConstantBuffer { diff --git a/Projects/Asteroids/src/asteroids_d3d12.h b/Projects/Asteroids/src/asteroids_d3d12.h index 3021d28..fb2297b 100644 --- a/Projects/Asteroids/src/asteroids_d3d12.h +++ b/Projects/Asteroids/src/asteroids_d3d12.h @@ -37,6 +37,7 @@ CBUFFER_ALIGN struct DrawConstantBuffer { DirectX::XMFLOAT3 mDeepColor; float unused1; UINT mTextureIndex; + UINT unused2[3]; }; CBUFFER_ALIGN struct SkyboxConstantBuffer { diff --git a/Projects/Asteroids/src/settings.h b/Projects/Asteroids/src/settings.h index ea7e146..08f0a40 100644 --- a/Projects/Asteroids/src/settings.h +++ b/Projects/Asteroids/src/settings.h @@ -77,7 +77,7 @@ struct Settings DiligentVulkan }mode = DiligentD3D11; - int resourceBindingMode = 2; // Only for DiligentD3D12 mode + int resourceBindingMode = 3; // Only for DiligentD3D12 and DiligentVk modes bool lockFrameRate = false; bool animate = true; |
