-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathComputeShader.cpp
More file actions
111 lines (95 loc) · 2.82 KB
/
Copy pathComputeShader.cpp
File metadata and controls
111 lines (95 loc) · 2.82 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
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
#include "ComputeShader.h"
#include "ComputeShaderCreateInfo.h"
#include "BufferFactory.h"
namespace sh::render
{
ComputeShader::ComputeShader(const IRenderContext& ctx, ComputeShaderCreateInfo createInfo) :
ctx(ctx)
{
SetName(createInfo.shaderNode.shaderName);
shaderNode = std::move(createInfo.shaderNode);
spirv = std::move(createInfo.spirv);
// 코드 텍스트는 보존할 필요 없음
shaderNode.code.clear();
shaderNode.functions.clear();
shaderNode.declaration.clear();
}
ComputeShader::~ComputeShader() = default;
SH_RENDER_API auto ComputeShader::Serialize() const -> core::Json
{
core::Json mainJson = Super::Serialize();
core::Json& json = mainJson["computeShader"];
json["AST"] = shaderNode.Serialize();
json["spirv"] = spirv;
return mainJson;
}
SH_RENDER_API void ComputeShader::Deserialize(const core::Json& json)
{
Super::Deserialize(json);
if (!json.contains("computeShader"))
return;
const core::Json& csJson = json["computeShader"];
if (csJson.contains("AST"))
shaderNode.Deserialize(csJson["AST"]);
if (csJson.contains("spirv"))
spirv = csJson["spirv"].get<std::vector<uint8_t>>();
}
SH_RENDER_API void ComputeShader::SetFloats(const std::string& name, float* values, std::size_t count)
{
uint32_t binding = 0;
bool bFind = false;
for (const ShaderAST::BufferNode& bufferNode : shaderNode.buffers)
{
if (bufferNode.name == name)
{
if (!bufferNode.vars.empty() && bufferNode.vars[0].type == ShaderAST::VariableType::Float)
{
binding = bufferNode.binding;
bFind = true;
break;
}
}
}
if (!bFind)
return;
if (buffers.size() <= binding)
buffers.resize(binding + 1);
if (buffers[binding] == nullptr)
{
BufferFactory::CreateInfo ci{};
ci.bDynamic = true;
ci.size = sizeof(float) * count;
buffers[binding] = BufferFactory::Create(ctx, ci);
buffers[binding]->SetData(values);
if (shaderBinding == nullptr)
shaderBinding = BufferFactory::CreateShaderBinding(ctx, *this);
shaderBinding->Link(binding, *buffers[binding]);
}
else
{
buffers[binding]->Resize(sizeof(float) * count);
buffers[binding]->SetData(values);
if (shaderBinding == nullptr)
shaderBinding = BufferFactory::CreateShaderBinding(ctx, *this);
shaderBinding->Link(binding, *buffers[binding]);
}
}
SH_RENDER_API auto ComputeShader::GetBuffer(const std::string& name) -> IBuffer*
{
std::optional<uint32_t> binding = GetBinding(name);
if (!binding.has_value())
return nullptr;
if (*binding >= buffers.size())
return nullptr;
return buffers[*binding].get();
}
auto ComputeShader::GetBinding(const std::string& name) -> std::optional<uint32_t>
{
for (const ShaderAST::BufferNode& bufferNode : shaderNode.buffers)
{
if (bufferNode.name == name)
return bufferNode.binding;
}
return {};
}
}//namespace