diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2019-10-19 21:31:56 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2019-10-19 21:31:56 +0000 |
| commit | af5a3688c57f0f0a9406fb1ea488e093d5822aea (patch) | |
| tree | 3780348ac277ab1df447c0b5d2bed6eef3b074f4 /Projects | |
| parent | Fixed UWP build error (diff) | |
| download | DiligentEngine-af5a3688c57f0f0a9406fb1ea488e093d5822aea.tar.gz DiligentEngine-af5a3688c57f0f0a9406fb1ea488e093d5822aea.zip | |
Updated submodules (API version 240033);
Enabled bindless mode in Asteroid demo
Diffstat (limited to 'Projects')
| -rw-r--r-- | Projects/Asteroids/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroid_ps.hlsl | 8 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroid_ps_d3d11.hlsl | 3 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroid_ps_diligent.hlsl | 9 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroid_vs.hlsl | 47 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroids_DE.cpp | 139 | ||||
| -rw-r--r-- | Projects/Asteroids/src/asteroids_DE.h | 2 | ||||
| -rw-r--r-- | Projects/Asteroids/src/shader_common.h | 25 |
8 files changed, 162 insertions, 72 deletions
diff --git a/Projects/Asteroids/CMakeLists.txt b/Projects/Asteroids/CMakeLists.txt index 4bb80c3..d932a61 100644 --- a/Projects/Asteroids/CMakeLists.txt +++ b/Projects/Asteroids/CMakeLists.txt @@ -87,6 +87,7 @@ if(WIN32) ${MEDIA} SDK/Include/d3dx12.h src/common_defines.h + src/shader_common.h readme.md ) set_target_properties(Asteroids PROPERTIES diff --git a/Projects/Asteroids/src/asteroid_ps.hlsl b/Projects/Asteroids/src/asteroid_ps.hlsl index c645486..5c5bfd3 100644 --- a/Projects/Asteroids/src/asteroid_ps.hlsl +++ b/Projects/Asteroids/src/asteroid_ps.hlsl @@ -1,5 +1,5 @@ -#include "asteroid_vs.hlsl" #include "common_defines.h" +#include "shader_common.h" // Apparently tools don't like unbounded/bindless texture arrays, so use the real constant for now Texture2DArray<float4> Tex[NUM_UNIQUE_TEXTURES] : register(t0); @@ -31,9 +31,9 @@ float4 asteroid_ps(in float4 position : SV_Position, // and forward substituting the above and then refusing to compile "divergent" // coordinates... float3 detailTex = 0.0f; - detailTex += blendWeights.x * Tex[mTextureIndex].Sample(Sampler, coords1).xyz; - detailTex += blendWeights.y * Tex[mTextureIndex].Sample(Sampler, coords2).xyz; - detailTex += blendWeights.z * Tex[mTextureIndex].Sample(Sampler, coords3).xyz; + detailTex += blendWeights.x * Tex[vs_output.textureId].Sample(Sampler, coords1).xyz; + detailTex += blendWeights.y * Tex[vs_output.textureId].Sample(Sampler, coords2).xyz; + detailTex += blendWeights.z * Tex[vs_output.textureId].Sample(Sampler, coords3).xyz; float wrap = 0.0f; float wrap_diffuse = saturate((dot(normal, normalize(lightPos)) + wrap) / (1.0f + wrap)); diff --git a/Projects/Asteroids/src/asteroid_ps_d3d11.hlsl b/Projects/Asteroids/src/asteroid_ps_d3d11.hlsl index f4987c9..8b58d09 100644 --- a/Projects/Asteroids/src/asteroid_ps_d3d11.hlsl +++ b/Projects/Asteroids/src/asteroid_ps_d3d11.hlsl @@ -1,5 +1,4 @@ -#include "asteroid_vs.hlsl" -#include "common_defines.h" +#include "shader_common.h" Texture2DArray<float4> Tex : register(t0); sampler Sampler : register(s0); diff --git a/Projects/Asteroids/src/asteroid_ps_diligent.hlsl b/Projects/Asteroids/src/asteroid_ps_diligent.hlsl index c2f6f0b..bd1ee1d 100644 --- a/Projects/Asteroids/src/asteroid_ps_diligent.hlsl +++ b/Projects/Asteroids/src/asteroid_ps_diligent.hlsl @@ -1,12 +1,5 @@ #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; -}; +#include "shader_common.h" #ifdef BINDLESS diff --git a/Projects/Asteroids/src/asteroid_vs.hlsl b/Projects/Asteroids/src/asteroid_vs.hlsl index f19fe2c..3498d33 100644 --- a/Projects/Asteroids/src/asteroid_vs.hlsl +++ b/Projects/Asteroids/src/asteroid_vs.hlsl @@ -1,39 +1,46 @@ -cbuffer DrawConstantBuffer// : register(b0) -{ - float4x4 mWorld; - float4x4 mViewProjection; - float4 mSurfaceColor; - float4 mDeepColor; - uint mTextureIndex; -}; +#include "shader_common.h" + +#ifdef BINDLESS + +StructuredBuffer<AsteroidData> g_Data; -struct VSOut +#else + +cbuffer DrawConstantBuffer { - 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; + AsteroidData g_Data; }; +#endif + float linstep(float min, float max, float s) { return saturate((s - min) / (max - min)); } -void asteroid_vs(in float3 in_pos : ATTRIB0, +void asteroid_vs(in float3 in_pos : ATTRIB0, in float3 in_normal : ATTRIB1, - out float4 position : SV_Position, +#ifdef BINDLESS + in uint AsteroidId : ATTRIB2, // SV_InstanceId is not affected by BaseInstance +#endif + out float4 position : SV_Position, out VSOut vs_output) { - float3 positionWorld = mul(mWorld, float4(in_pos, 1.0f)).xyz; - position = mul(mViewProjection, float4(positionWorld, 1.0f)); +#ifdef BINDLESS + AsteroidData Data = g_Data[AsteroidId]; +#else + AsteroidData Data = g_Data; +#endif + + float3 positionWorld = mul(Data.World, float4(in_pos, 1.0f)).xyz; + position = mul(Data.ViewProjection, float4(positionWorld, 1.0f)); vs_output.positionModel = in_pos; - vs_output.normalWorld = mul(mWorld, float4(in_normal, 0.0f)).xyz; // No non-uniform scaling + vs_output.normalWorld = mul(Data.World, float4(in_normal, 0.0f)).xyz; // No non-uniform scaling float depth = linstep(0.5f, 0.7f, length(in_pos.xyz)); - vs_output.albedo = lerp(mDeepColor.xyz, mSurfaceColor.xyz, depth); + vs_output.albedo = lerp(Data.DeepColor.xyz, Data.SurfaceColor.xyz, depth); - vs_output.textureId = mTextureIndex; + vs_output.textureId = Data.TextureIndex; } diff --git a/Projects/Asteroids/src/asteroids_DE.cpp b/Projects/Asteroids/src/asteroids_DE.cpp index 3cafba9..0b8408d 100644 --- a/Projects/Asteroids/src/asteroids_DE.cpp +++ b/Projects/Asteroids/src/asteroids_DE.cpp @@ -237,14 +237,47 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G std::vector<StateTransitionDesc> Barriers; mBackBufferWidth = mSwapChain->GetDesc().Width; mBackBufferHeight = mSwapChain->GetDesc().Height; - // Create draw constant buffer + const auto MaxAsteroidsInSubset = (NUM_ASTEROIDS + mNumSubsets - 1) / mNumSubsets; + + if (m_BindingMode == BindingMode::Bindless) + { + { + BufferDesc desc; + desc.Name = "Instance ID buffer"; + desc.Usage = USAGE_STATIC; + desc.BindFlags = BIND_VERTEX_BUFFER; + desc.uiSizeInBytes = static_cast<Uint32>(sizeof(Uint32)) * MaxAsteroidsInSubset; + std::vector<Uint32> Ids(MaxAsteroidsInSubset); + for (Uint32 i=0; i < Ids.size(); ++i) + Ids[i] = i; + BufferData Data(Ids.data(), desc.uiSizeInBytes); + mDevice->CreateBuffer(desc, &Data, &mInstanceIDBuffer); + Barriers.emplace_back(mInstanceIDBuffer, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_VERTEX_BUFFER, true); + } + { + BufferDesc desc; + desc.Name = "Asteroids data buffer"; + desc.Usage = USAGE_DYNAMIC; + desc.BindFlags = BIND_SHADER_RESOURCE; + desc.Mode = BUFFER_MODE_STRUCTURED; + desc.CPUAccessFlags = CPU_ACCESS_WRITE; + desc.ElementByteStride = static_cast<Uint32>(sizeof(DrawConstantBuffer)); + desc.uiSizeInBytes = desc.ElementByteStride * MaxAsteroidsInSubset; + mAsteroidsDataBuffers.resize(mNumSubsets); + for(Uint32 i=0; i < mNumSubsets; ++i) + { + mDevice->CreateBuffer(desc, nullptr, &mAsteroidsDataBuffers[i]); + } + } + } + else { BufferDesc desc; - desc.Name = "draw constant buffer (dynamic)"; - desc.Usage = USAGE_DYNAMIC; - desc.uiSizeInBytes = (Uint32) sizeof(DrawConstantBuffer); - desc.BindFlags = BIND_UNIFORM_BUFFER; + desc.Name = "Asteroids constant buffer"; + desc.Usage = USAGE_DYNAMIC; desc.CPUAccessFlags = CPU_ACCESS_WRITE; + desc.BindFlags = BIND_UNIFORM_BUFFER; + desc.uiSizeInBytes = (Uint32) sizeof(DrawConstantBuffer); mDevice->CreateBuffer(desc, nullptr, &mDrawConstantBuffer); Barriers.emplace_back(mDrawConstantBuffer, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_CONSTANT_BUFFER, true); } @@ -255,11 +288,12 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G LayoutElement inputDesc[] = { LayoutElement{ 0, 0, 3, VT_FLOAT32, false, 0, sizeof(Vertex)}, - LayoutElement{ 1, 0, 3, VT_FLOAT32} + LayoutElement{ 1, 0, 3, VT_FLOAT32}, + LayoutElement{ 2, 1, 1, VT_UINT32, False, LayoutElement::FREQUENCY_PER_INSTANCE} }; PSODesc.GraphicsPipeline.InputLayout.LayoutElements = inputDesc; - PSODesc.GraphicsPipeline.InputLayout.NumElements = _countof(inputDesc); + PSODesc.GraphicsPipeline.InputLayout.NumElements = (m_BindingMode == BindingMode::Bindless) ? 3 : 2; PSODesc.GraphicsPipeline.DepthStencilDesc.DepthFunc = COMPARISON_FUNC_GREATER_EQUAL; @@ -273,6 +307,11 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G attribs.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL; attribs.pShaderSourceStreamFactory = pShaderSourceFactory; attribs.UseCombinedTextureSamplers = true; + + ShaderMacro Macros[] = {{"BINDLESS", "1"}, {}}; + if (m_BindingMode == BindingMode::Bindless) + attribs.Macros = Macros; + mDevice->CreateShader(attribs, &vs); } @@ -286,17 +325,11 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G attribs.UseCombinedTextureSamplers = true; attribs.SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL; - if(m_BindingMode == BindingMode::Bindless) - { - ShaderMacro Macros[] = {{"BINDLESS", "1"}, {}}; + ShaderMacro Macros[] = {{"BINDLESS", "1"}, {}}; + if (m_BindingMode == BindingMode::Bindless) attribs.Macros = Macros; - mDevice->CreateShader(attribs, &ps); - attribs.Macros = nullptr; - } - else - { - mDevice->CreateShader(attribs, &ps); - } + + mDevice->CreateShader(attribs, &ps); } StaticSamplerDesc samDesc; @@ -317,13 +350,16 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G PSODesc.ResourceLayout.StaticSamplers = &samDesc; PSODesc.ResourceLayout.NumStaticSamplers = 1; - ShaderResourceVariableDesc Variables[] = + std::vector<ShaderResourceVariableDesc> Variables = { {SHADER_TYPE_PIXEL, "Tex", m_BindingMode == BindingMode::Dynamic ? SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC : SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE} }; + if (m_BindingMode == BindingMode::Bindless) + Variables.emplace_back(SHADER_TYPE_VERTEX, "g_Data", SHADER_RESOURCE_VARIABLE_TYPE_MUTABLE); + PSODesc.ResourceLayout.DefaultVariableType = SHADER_RESOURCE_VARIABLE_TYPE_STATIC; - PSODesc.ResourceLayout.Variables = Variables; - PSODesc.ResourceLayout.NumVariables = _countof(Variables); + PSODesc.ResourceLayout.Variables = Variables.data(); + PSODesc.ResourceLayout.NumVariables = static_cast<Uint32>(Variables.size()); PSODesc.GraphicsPipeline.RTVFormats[0] = mSwapChain->GetDesc().ColorBufferFormat; PSODesc.GraphicsPipeline.NumRenderTargets = 1; @@ -350,10 +386,11 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G } else if(m_BindingMode == BindingMode::Bindless) { - NumSRBs = 1; + NumSRBs = mNumSubsets; } mDevice->CreatePipelineState(PSODesc, &mAsteroidsPSO); - mAsteroidsPSO->GetStaticVariableByName(SHADER_TYPE_VERTEX, "DrawConstantBuffer")->Set(mDrawConstantBuffer); + if (m_BindingMode != BindingMode::Bindless) + mAsteroidsPSO->GetStaticVariableByName(SHADER_TYPE_VERTEX, "DrawConstantBuffer")->Set(mDrawConstantBuffer); mAsteroidsSRBs.resize(NumSRBs); for(size_t srb = 0; srb < mAsteroidsSRBs.size(); ++srb) @@ -564,7 +601,11 @@ Asteroids::Asteroids(const Settings &settings, AsteroidsSimulation* asteroids, G 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); + for(Uint32 i = 0; i < mNumSubsets; ++i) + { + mAsteroidsSRBs[i]->GetVariableByName(SHADER_TYPE_PIXEL, "Tex")->SetArray(SRVArray, 0, NUM_UNIQUE_TEXTURES); + mAsteroidsSRBs[i]->GetVariableByName(SHADER_TYPE_VERTEX, "g_Data")->Set(mAsteroidsDataBuffers[i]->GetDefaultView(BUFFER_VIEW_SHADER_RESOURCE)); + } } mDeviceCtxt->TransitionResourceStates(static_cast<Uint32>(Barriers.size()), Barriers.data()); } @@ -790,24 +831,41 @@ void Asteroids::RenderSubset(Diligent::Uint32 SubsetNum, pCtx->SetPipelineState(mAsteroidsPSO); { - IBuffer* ia_buffers[] = { mVertexBuffer }; - Uint32 ia_offsets[] = { 0 }; - pCtx->SetVertexBuffers(0, 1, ia_buffers, ia_offsets, RESOURCE_STATE_TRANSITION_MODE_VERIFY, SET_VERTEX_BUFFERS_FLAG_NONE); + IBuffer* ia_buffers[] = { mVertexBuffer, mInstanceIDBuffer }; + Uint32 ia_offsets[_countof(ia_buffers)] = {}; + pCtx->SetVertexBuffers(0, (m_BindingMode == BindingMode::Bindless) ? 2 : 1, ia_buffers, ia_offsets, RESOURCE_STATE_TRANSITION_MODE_VERIFY, SET_VERTEX_BUFFERS_FLAG_NONE); pCtx->SetIndexBuffer(mIndexBuffer, 0, RESOURCE_STATE_TRANSITION_MODE_VERIFY); } - auto pVar = m_BindingMode == BindingMode::Dynamic ? mAsteroidsSRBs[SubsetNum]->GetVariableByName(SHADER_TYPE_PIXEL, "Tex") : nullptr; - if( m_BindingMode == BindingMode::Bindless) + auto viewProjection = camera.ViewProjection(); + + if (m_BindingMode == BindingMode::Bindless) { - pCtx->CommitShaderResources(mAsteroidsSRBs[0], RESOURCE_STATE_TRANSITION_MODE_VERIFY); + { + MapHelper<DrawConstantBuffer> drawConstants(pCtx, mAsteroidsDataBuffers[SubsetNum], MAP_WRITE, MAP_FLAG_DISCARD); + UINT i=0; + for (UINT drawIdx = startIdx; drawIdx < startIdx+numAsteroids; ++drawIdx, ++i) + { + const auto staticData = &staticAsteroidData[drawIdx]; + const auto dynamicData = &dynamicAsteroidData[drawIdx]; + + XMStoreFloat4x4(&drawConstants[i].mWorld, dynamicData->world); + XMStoreFloat4x4(&drawConstants[i].mViewProjection, viewProjection); + drawConstants[i].mSurfaceColor = staticData->surfaceColor; + drawConstants[i].mDeepColor = staticData->deepColor; + drawConstants[i].mTextureIndex = staticData->textureIndex; + } + } + pCtx->CommitShaderResources(mAsteroidsSRBs[SubsetNum], RESOURCE_STATE_TRANSITION_MODE_TRANSITION); } - - auto viewProjection = camera.ViewProjection(); + + auto pVar = m_BindingMode == BindingMode::Dynamic ? mAsteroidsSRBs[SubsetNum]->GetVariableByName(SHADER_TYPE_PIXEL, "Tex") : nullptr; for (UINT drawIdx = startIdx; drawIdx < startIdx+numAsteroids; ++drawIdx) { - auto staticData = &staticAsteroidData[drawIdx]; - auto dynamicData = &dynamicAsteroidData[drawIdx]; + const auto staticData = &staticAsteroidData[drawIdx]; + const auto dynamicData = &dynamicAsteroidData[drawIdx]; + if( m_BindingMode != BindingMode::Bindless ) { MapHelper<DrawConstantBuffer> drawConstants(pCtx, mDrawConstantBuffer, MAP_WRITE, MAP_FLAG_DISCARD); XMStoreFloat4x4(&drawConstants->mWorld, dynamicData->world); @@ -816,6 +874,7 @@ void Asteroids::RenderSubset(Diligent::Uint32 SubsetNum, drawConstants->mDeepColor = staticData->deepColor; drawConstants->mTextureIndex = staticData->textureIndex; } + if( m_BindingMode == BindingMode::Dynamic ) { pVar->Set(mTextureSRVs[staticData->textureIndex]); @@ -830,10 +889,11 @@ void Asteroids::RenderSubset(Diligent::Uint32 SubsetNum, pCtx->CommitShaderResources(mAsteroidsSRBs[staticData->textureIndex], RESOURCE_STATE_TRANSITION_MODE_VERIFY); } - DrawAttribs attribs(dynamicData->indexCount, VT_UINT16, DRAW_FLAG_VERIFY_ALL); + DrawIndexedAttribs attribs(dynamicData->indexCount, VT_UINT16, DRAW_FLAG_VERIFY_ALL); attribs.FirstIndexLocation = dynamicData->indexStart; attribs.BaseVertex = staticData->vertexStart; - pCtx->Draw(attribs); + attribs.FirstInstanceLocation = drawIdx - startIdx; + pCtx->DrawIndexed(attribs); } } @@ -853,7 +913,7 @@ void Asteroids::Render(float frameTime, const OrbitCamera& camera, const Setting QueryPerformanceCounter((LARGE_INTEGER*)&currCounter); mUpdateTicks = currCounter; - auto SubsetSize = NUM_ASTEROIDS / (settings.multithreadedRendering ? mNumSubsets : 1); + auto SubsetSize = NUM_ASTEROIDS / mNumSubsets; if (settings.multithreadedRendering) { @@ -861,7 +921,9 @@ void Asteroids::Render(float frameTime, const OrbitCamera& camera, const Setting mUpdateSubsetsSignal.Trigger(true); } - mAsteroids->Update(frameTime, camera.Eye(), settings, 0, SubsetSize); + + for(Uint32 i=0; i < (!settings.multithreadedRendering ? mNumSubsets : 1); ++i) + mAsteroids->Update(frameTime, camera.Eye(), settings, SubsetSize * i, SubsetSize); if (settings.multithreadedRendering) { @@ -885,7 +947,8 @@ void Asteroids::Render(float frameTime, const OrbitCamera& camera, const Setting mRenderSubsetsSignal.Trigger(true); } - RenderSubset(0, mDeviceCtxt, camera, 0, SubsetSize); + for(Uint32 i=0; i < (!settings.multithreadedRendering ? mNumSubsets : 1); ++i) + RenderSubset(i, mDeviceCtxt, camera, SubsetSize * i, SubsetSize); if (settings.multithreadedRendering) { diff --git a/Projects/Asteroids/src/asteroids_DE.h b/Projects/Asteroids/src/asteroids_DE.h index 60a56cc..2857ac0 100644 --- a/Projects/Asteroids/src/asteroids_DE.h +++ b/Projects/Asteroids/src/asteroids_DE.h @@ -83,6 +83,8 @@ private: Diligent::RefCntAutoPtr<Diligent::IBuffer> mIndexBuffer; Diligent::RefCntAutoPtr<Diligent::IBuffer> mVertexBuffer; + Diligent::RefCntAutoPtr<Diligent::IBuffer> mInstanceIDBuffer; + std::vector<Diligent::RefCntAutoPtr<Diligent::IBuffer>> mAsteroidsDataBuffers; Diligent::RefCntAutoPtr<Diligent::IBuffer> mDrawConstantBuffer; Diligent::RefCntAutoPtr<Diligent::IBuffer> mSpriteVertexBuffer; Diligent::RefCntAutoPtr<Diligent::IBuffer> mSkyboxConstantBuffer; diff --git a/Projects/Asteroids/src/shader_common.h b/Projects/Asteroids/src/shader_common.h new file mode 100644 index 0000000..ced6a70 --- /dev/null +++ b/Projects/Asteroids/src/shader_common.h @@ -0,0 +1,25 @@ +#ifndef SHADER_COMMON_H +#define SHADER_COMMON_H + +struct VSOut +{ + float3 positionModel : POSITIONMODEL; + float3 normalWorld : NORMAL; + float3 albedo : ALBEDO; + uint textureId : TEXTURE_ID; +}; + +struct AsteroidData +{ + float4x4 World; + float4x4 ViewProjection; + float4 SurfaceColor; + float4 DeepColor; + + uint TextureIndex; + uint Padding0; + uint Padding1; + uint Padding2; +}; + +#endif |
