summaryrefslogtreecommitdiffstats
path: root/Projects/Asteroids/src
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2019-10-18 01:26:07 +0000
committerEgor Yusov <egor.yusov@gmail.com>2019-10-18 01:26:07 +0000
commit085e1e07fe61386e46395fa06deee96479f44f5a (patch)
tree6e11d0406f72548fe697bb448ea23814b4c3fecd /Projects/Asteroids/src
parentUpdated readme (diff)
downloadDiligentEngine-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.cpp9
-rw-r--r--Projects/Asteroids/src/asteroid_ps_d3d11.hlsl41
-rw-r--r--Projects/Asteroids/src/asteroid_ps_diligent.hlsl72
-rw-r--r--Projects/Asteroids/src/asteroid_vs.hlsl3
-rw-r--r--Projects/Asteroids/src/asteroids_DE.cpp61
-rw-r--r--Projects/Asteroids/src/asteroids_DE.h18
-rw-r--r--Projects/Asteroids/src/asteroids_d3d11.h1
-rw-r--r--Projects/Asteroids/src/asteroids_d3d12.h1
-rw-r--r--Projects/Asteroids/src/settings.h2
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;