summaryrefslogtreecommitdiff
path: root/src/FFT_Simulation_DirectCompute_impl.h
diff options
context:
space:
mode:
authorJason Maskell <[email protected]>2016-05-09 10:39:54 +0200
committerJason Maskell <[email protected]>2016-05-09 10:39:54 +0200
commit79b3462799c28af8ba586349bd671b1b56e72353 (patch)
tree3b06e36c390254c0dc7f3733a0d32af213d87293 /src/FFT_Simulation_DirectCompute_impl.h
downloadwaveworks_archive-79b3462799c28af8ba586349bd671b1b56e72353.tar.xz
waveworks_archive-79b3462799c28af8ba586349bd671b1b56e72353.zip
Initial commit with PS4 and XBone stuff trimmed.
Diffstat (limited to 'src/FFT_Simulation_DirectCompute_impl.h')
-rw-r--r--src/FFT_Simulation_DirectCompute_impl.h190
1 files changed, 190 insertions, 0 deletions
diff --git a/src/FFT_Simulation_DirectCompute_impl.h b/src/FFT_Simulation_DirectCompute_impl.h
new file mode 100644
index 0000000..c01e62c
--- /dev/null
+++ b/src/FFT_Simulation_DirectCompute_impl.h
@@ -0,0 +1,190 @@
+// This code contains NVIDIA Confidential Information and is disclosed
+// under the Mutual Non-Disclosure Agreement.
+//
+// Notice
+// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES
+// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
+//
+// NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. No third party distribution is allowed unless
+// expressly authorized by NVIDIA. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright � 2008- 2013 NVIDIA Corporation. All rights reserved.
+//
+// NVIDIA Corporation and its licensors retain all intellectual property and proprietary
+// rights in and to this software and related documentation and any modifications thereto.
+// Any use, reproduction, disclosure or distribution of this software and related
+// documentation without an express license agreement from NVIDIA Corporation is
+// strictly prohibited.
+//
+
+#ifndef _NVWAVEWORKS_FFT_SIMULATION_DIRECTCOMPUTE_IMPL_H
+#define _NVWAVEWORKS_FFT_SIMULATION_DIRECTCOMPUTE_IMPL_H
+
+#include "FFT_Simulation.h"
+
+#ifdef SUPPORT_DIRECTCOMPUTE
+
+class NVWaveWorks_FFT_Simulation_Manager_DirectCompute_Impl;
+template<class T> class CircularFIFO;
+
+class NVWaveWorks_FFT_Simulation_DirectCompute_Impl : public NVWaveWorks_FFT_Simulation
+{
+public:
+ NVWaveWorks_FFT_Simulation_DirectCompute_Impl(NVWaveWorks_FFT_Simulation_Manager_DirectCompute_Impl* pManager, const GFSDK_WaveWorks_Detailed_Simulation_Params::Cascade& params);
+ ~NVWaveWorks_FFT_Simulation_DirectCompute_Impl();
+
+ // Mandatory NVWaveWorks_FFT_Simulation interface
+ HRESULT initD3D9(IDirect3DDevice9* pD3DDevice);
+ HRESULT initD3D10(ID3D10Device* pD3DDevice);
+ HRESULT initD3D11(ID3D11Device* pD3DDevice);
+ HRESULT initNoGraphics() { return S_OK; }
+ HRESULT reinit(const GFSDK_WaveWorks_Detailed_Simulation_Params::Cascade& params);
+ HRESULT addDisplacements(const gfsdk_float2* inSamplePoints, gfsdk_float4* outDisplacements, UINT numSamples);
+ HRESULT addArchivedDisplacements(float coord, const gfsdk_float2* inSamplePoints, gfsdk_float4* outDisplacements, UINT numSamples);
+ HRESULT getTimings(NVWaveWorks_FFT_Simulation_Timings&) const;
+ gfsdk_U64 getDisplacementMapVersion() const { return m_DisplacementMapVersion; }
+ LPDIRECT3DTEXTURE9 GetDisplacementMapD3D9();
+ ID3D10ShaderResourceView** GetDisplacementMapD3D10();
+ ID3D11ShaderResourceView** GetDisplacementMapD3D11();
+ GLuint GetDisplacementMapGL2();
+
+ HRESULT kick(Graphics_Context* pGC, double dSimTime, gfsdk_U64 kickID);
+
+ HRESULT collectSingleReadbackResult(bool blocking);
+ bool getReadbackCursor(gfsdk_U64* pKickID);
+ bool hasReadbacksInFlight() const;
+ HRESULT canCollectSingleReadbackResultWithoutBlocking();
+ HRESULT resetReadbacks();
+
+ HRESULT archiveDisplacements();
+
+private:
+
+ NVWaveWorks_FFT_Simulation_Manager_DirectCompute_Impl* m_pManager;
+
+ GFSDK_WaveWorks_Detailed_Simulation_Params::Cascade m_params;
+
+ unsigned int m_resolution; // m_params.fft_resolution
+ unsigned int m_half_resolution_plus_one;
+
+ bool m_avoid_frame_depedencies; // if SLI, currently always true (performance issue)
+ bool m_GaussAndOmegaInitialised;
+ bool m_H0Dirty;
+
+ HRESULT allocateAllResources();
+ void releaseAllResources();
+ void releaseAll();
+ HRESULT initGaussAndOmega();
+ void updateConstantBuffer(double simTime) const;
+
+ enum { NumReadbackSlots = 4 }; // 2 in-flight, one usable, one active
+ enum { NumTimerSlots = 4 }; // 2 in-flight, one usable, one active
+
+ int m_active_readback_slot; // i.e. not in-flight
+ int m_end_inflight_readback_slots; // the first in-flight slot is always the one after active
+ bool m_ReadbackInitialised;
+
+ gfsdk_U64 m_readback_kickIDs[NumReadbackSlots];
+
+ gfsdk_U64 m_DisplacementMapVersion;
+
+ HRESULT consumeAvailableReadbackSlot(int& slot, gfsdk_U64 kickID);
+ HRESULT waitForAllInFlightReadbacks();
+
+ float m_timer_results[NumTimerSlots];
+ gfsdk_U64 m_timer_kickIDs[NumReadbackSlots];
+ int m_active_timer_slot; // i.e. not in-flight
+ int m_end_inflight_timer_slots; // the first in-flight slot is always the one after active
+
+ HRESULT consumeAvailableTimerSlot(int& slot, gfsdk_U64 kickID);
+ HRESULT waitForAllInFlightTimers();
+
+ void add_displacements_float16_d3d11( ID3D11Texture2D* buffer,
+ const gfsdk_float2* inSamplePoints,
+ gfsdk_float4* outDisplacements,
+ UINT numSamples,
+ float multiplier
+ );
+
+ HRESULT addArchivedDisplacementsD3D11( float coord,
+ const gfsdk_float2* inSamplePoints,
+ gfsdk_float4* outDisplacements,
+ UINT numSamples
+ );
+
+ // D3D API handling
+ nv_water_d3d_api m_d3dAPI;
+
+ struct D3D11Objects
+ {
+ ID3D11Device* m_device;
+ ID3D11DeviceContext* m_context;
+
+ // The Gauss distribution used to generated H0 (size: N x N).
+ ID3D11Buffer* m_buffer_Gauss;
+ // Angular frequency (size: N/2+1 x N/2+1).
+ ID3D11Buffer* m_buffer_Omega;
+ // Initial height field H(0) generated by Phillips spectrum & Gauss distribution (size: N+1 x N+1).
+ ID3D11Buffer* m_buffer_H0;
+ // Height field H(t) in frequency domain, updated each frame (size: N/2+1 x N).
+ ID3D11Buffer* m_buffer_Ht;
+ // Choppy fields Dx(t) and Dy(t), updated each frame (size: N/2+1 x N).
+ ID3D11Buffer* m_buffer_Dt;
+ // Displacement/choppy field (size: N x N).
+ ID3D11Texture2D* m_texture_Displacement;
+ // per-frame constants (todo: only time is updated every frame, worth splitting?)
+ ID3D11Buffer* m_buffer_constants;
+
+ ID3D11ShaderResourceView* m_srv_Gauss;
+ ID3D11ShaderResourceView* m_srv_H0;
+ ID3D11ShaderResourceView* m_srv_Ht;
+ ID3D11ShaderResourceView* m_srv_Dt;
+ ID3D11ShaderResourceView* m_srv_Omega;
+ ID3D11ShaderResourceView* m_srv_Displacement; // (ABGR32F)
+
+ ID3D11UnorderedAccessView* m_uav_H0;
+ ID3D11UnorderedAccessView* m_uav_Ht;
+ ID3D11UnorderedAccessView* m_uav_Dt;
+ ID3D11UnorderedAccessView* m_uav_Displacement;
+
+ // readback staging
+ ID3D11Texture2D* m_readback_buffers[NumReadbackSlots];
+ ID3D11Query* m_readback_queries[NumReadbackSlots];
+ ID3D11Texture2D* m_active_readback_buffer;
+
+ struct ReadbackFIFOSlot
+ {
+ gfsdk_U64 kickID;
+ ID3D11Texture2D* buffer;
+ };
+ CircularFIFO<ReadbackFIFOSlot>* m_pReadbackFIFO;
+
+ // timers
+ ID3D11Query* m_frequency_queries[NumTimerSlots];
+ ID3D11Query* m_start_queries[NumTimerSlots];
+ ID3D11Query* m_end_queries[NumTimerSlots];
+
+ // Shaders
+ ID3D11ComputeShader* m_update_h0_shader;
+ ID3D11ComputeShader* m_row_shader;
+ ID3D11ComputeShader* m_column_shader;
+ };
+
+ union
+ {
+ D3D11Objects _11;
+ } m_d3d;
+};
+
+#endif // SUPPORT_DIRECTCOMPUTE
+
+#endif // _NVWAVEWORKS_FFT_SIMULATION_DIRECTCOMPUTE_IMPL_H