-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathTestComputeShader.cpp
More file actions
53 lines (46 loc) · 1.39 KB
/
Copy pathTestComputeShader.cpp
File metadata and controls
53 lines (46 loc) · 1.39 KB
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
#include "Component/TestComputeShader.h"
#include "Game/World.h"
#include "Game/Input.h"
#include "Render/Renderer.h"
#include "Render/ScriptableRenderer.h"
#include "Render/ComputeShader.h"
#include "Core/Logger.h"
namespace sh::game
{
TestComputeShader::TestComputeShader(GameObject& owner) :
Component(owner)
{
}
SH_GAME_API void TestComputeShader::Update()
{
if (!Input::GetKeyPressed(Input::KeyCode::C))
return;
if (shader == nullptr)
{
SH_ERROR("TestComputeShader: shader is null");
return;
}
render::ScriptableRenderer* const scriptableRenderer = world.renderer.GetScriptableRenderer();
if (scriptableRenderer == nullptr)
{
SH_ERROR("TestComputeShader: ScriptableRenderer is null");
return;
}
std::vector<float> a(10'000, 0);
std::vector<float> b(10'000, 0);
std::vector<float> c(10'000, 0);
for (int i = 0; i < 10'000; ++i)
{
a[i] = i;
b[i] = 10'000 - i;
}
shader->SetFloats("bufferA", a.data(), a.size());
shader->SetFloats("bufferB", b.data(), b.size());
shader->SetFloats("bufferC", c.data(), c.size());
const uint32_t workGroup = std::ceil(10'000.f / 128.f);
SH_INFO_FORMAT("Dispatch ComputeShader [{} x {} x {}]", workGroup, 1, 1);
scriptableRenderer->Dispatch(*shader, workGroup, 1, 1);
std::vector<uint8_t> buffer = shader->GetBuffer("bufferC")->GetData();
std::memcpy(c.data(), buffer.data(), buffer.size());
}
}//namespace