-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathUploadFrameBlock.cpp
More file actions
68 lines (57 loc) · 1.96 KB
/
UploadFrameBlock.cpp
File metadata and controls
68 lines (57 loc) · 1.96 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
#include "UploadFrameBlock.hpp"
#include "fg/FrameGraph.hpp"
#include "fg/Blackboard.hpp"
#include "FrameGraphBuffer.hpp"
#include "FrameGraphHelper.hpp"
#include "FrameData.hpp"
#include "tracy/TracyOpenGL.hpp"
namespace {
struct alignas(16) GPUCamera {
GPUCamera(const PerspectiveCamera &camera)
: projection{camera.getProjection()},
inversedProjection{glm::inverse(projection)}, view{camera.getView()},
inversedView{glm::inverse(view)}, fov{camera.getFov()},
near{camera.getNear()}, far{camera.getFar()} {}
private:
glm::mat4 projection{1.0f};
glm::mat4 inversedProjection{1.0f};
glm::mat4 view{1.0f};
glm::mat4 inversedView{1.0f};
float fov;
float near, far;
// Implicit padding, 4bytes
};
struct GPUFrameBlock {
float time{0.0f};
float deltaTime{0.0f};
Extent2D resolution{0};
GPUCamera camera;
uint32_t renderFeatures{0};
uint32_t debugFlags{0};
};
} // namespace
void uploadFrameBlock(FrameGraph &fg, FrameGraphBlackboard &blackboard,
const FrameInfo &frameInfo) {
blackboard.add<FrameData>() = fg.addCallbackPass<FrameData>(
"UploadFrameBlock",
[&](FrameGraph::Builder &builder, FrameData &data) {
data.frameBlock = builder.create<FrameGraphBuffer>(
"FrameBlock", {.size = sizeof(GPUFrameBlock)});
data.frameBlock = builder.write(data.frameBlock);
},
[=](const FrameData &data, FrameGraphPassResources &resources, void *ctx) {
NAMED_DEBUG_MARKER("UploadFrameBlock");
TracyGpuZone("UploadFrameBlock");
const GPUFrameBlock frameBlock{
.time = frameInfo.time,
.deltaTime = frameInfo.deltaTime,
.resolution = frameInfo.resolution,
.camera = GPUCamera{frameInfo.camera},
.renderFeatures = frameInfo.features,
.debugFlags = frameInfo.debugFlags,
};
static_cast<RenderContext *>(ctx)->upload(
getBuffer(resources, data.frameBlock), 0, sizeof(GPUFrameBlock),
&frameBlock);
});
}