This repository has been archived by the owner on Dec 2, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 225
/
SimpleComputePC.h
147 lines (114 loc) · 4.17 KB
/
SimpleComputePC.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
//--------------------------------------------------------------------------------------
// SimpleComputePC.h
//
// Advanced Technology Group (ATG)
// Copyright (C) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
#pragma once
#include "DeviceResources.h"
#include "StepTimer.h"
#include "ControllerHelp.h"
class SmoothedFPS
{
public:
SmoothedFPS(uint32_t frameInterval = 100)
{
Initialize(frameInterval);
}
void Initialize(uint32_t frameInterval = 100)
{
m_frameInterval = frameInterval;
m_timeAccumulator = 0.0f;
m_frameAccumulator = 0;
m_smoothedFPS = 0.0f;
}
void Tick(float DeltaTime)
{
m_timeAccumulator += DeltaTime;
++m_frameAccumulator;
if (m_frameAccumulator >= m_frameInterval)
{
m_smoothedFPS = (float)m_frameInterval / m_timeAccumulator;
m_timeAccumulator = 0.0f;
m_frameAccumulator = 0;
}
}
float GetFPS() const { return m_smoothedFPS; }
private:
float m_smoothedFPS;
float m_timeAccumulator;
uint32_t m_frameAccumulator;
uint32_t m_frameInterval;
};
// A basic sample implementation that creates a D3D11 device and
// provides a render loop.
class Sample final : public DX::IDeviceNotify
{
public:
Sample() noexcept(false);
~Sample() = default;
Sample(Sample&&) = default;
Sample& operator= (Sample&&) = default;
Sample(Sample const&) = delete;
Sample& operator= (Sample const&) = delete;
// Initialization and management
void Initialize(HWND window, int width, int height);
// Basic render loop
void Tick();
// IDeviceNotify
virtual void OnDeviceLost() override;
virtual void OnDeviceRestored() override;
// Messages
void OnActivated();
void OnDeactivated();
void OnSuspending();
void OnResuming();
void OnWindowMoved();
void OnWindowSizeChanged(int width, int height);
// Properties
void GetDefaultSize( int& width, int& height ) const;
private:
struct CB_FractalCS
{
DirectX::XMFLOAT4 MaxThreadIter;
DirectX::XMFLOAT4 Window;
};
void Update(DX::StepTimer const& timer);
void Render();
void Clear();
void CreateDeviceDependentResources();
void CreateWindowSizeDependentResources();
void ResetWindow();
void UpdateFractalData();
// Device resources.
std::unique_ptr<DX::DeviceResources> m_deviceResources;
// Rendering loop timer.
DX::StepTimer m_timer;
std::unique_ptr<ATG::Help> m_help;
bool m_showHelp;
// Input devices.
std::unique_ptr<DirectX::GamePad> m_gamePad;
std::unique_ptr<DirectX::Keyboard> m_keyboard;
std::unique_ptr<DirectX::Mouse> m_mouse;
DirectX::GamePad::ButtonStateTracker m_gamePadButtons;
DirectX::Keyboard::KeyboardStateTracker m_keyboardButtons;
bool m_gamepadPresent;
// Compute data
SmoothedFPS m_renderFPS;
uint64_t* m_fractalTimestamps;
DirectX::XMFLOAT4 m_window;
bool m_windowUpdated;
uint32_t m_fractalMaxIterations;
Microsoft::WRL::ComPtr<ID3D11Buffer> m_cbFractal;
Microsoft::WRL::ComPtr<ID3D11ComputeShader> m_csFractal;
Microsoft::WRL::ComPtr<ID3D11Texture2D> m_fractalTexture;
Microsoft::WRL::ComPtr<ID3D11UnorderedAccessView> m_fractalUAV;
Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> m_fractalSRV;
Microsoft::WRL::ComPtr<ID3D11Texture2D> m_fractalColorMap;
Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> m_fractalColorMapSRV;
Microsoft::WRL::ComPtr<ID3D11SamplerState> m_fractalBilinearSampler;
// DirectXTK objects.
std::unique_ptr<DirectX::SpriteBatch> m_spriteBatch;
std::unique_ptr<DirectX::SpriteFont> m_font;
std::unique_ptr<DirectX::SpriteFont> m_ctrlFont;
};