blob: 55c3bbb60acbc807baaad8c3d683dd3195d72b2a (
plain)
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
|
// Copyright (C) 2020 Klaralvdalens Datakonsult AB (KDAB).
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QT3DRENDER_RENDER_RHI_PIPELINEUBOSET_H
#define QT3DRENDER_RENDER_RHI_PIPELINEUBOSET_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of other Qt classes. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <rhihandle_types_p.h>
#include <rhi/qrhi.h>
#include <shadervariables_p.h>
#include <rhishader_p.h>
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
namespace Render {
class ShaderData;
class NodeManagers;
namespace Rhi {
class RHIShader;
class RHIBuffer;
class RenderCommand;
class SubmissionContext;
class RenderView;
class RHIResourceManagers;
class PipelineUBOSet
{
public:
struct UBOBufferWithBindingAndBlockSize
{
int binding = -1;
int blockSize = -1;
size_t alignedBlockSize = 0;
HRHIBuffer buffer;
};
struct MultiUBOBufferWithBindingAndBlockSize
{
int binding = -1;
int blockSize = -1;
size_t alignedBlockSize = 0;
size_t alignment = 0;
size_t commandsPerUBO = 0;
std::vector<HRHIBuffer> buffers;
HRHIBuffer bufferForCommand(size_t distanceToCommand) const;
size_t localOffsetInBufferForCommand(size_t distanceToCommand) const;
};
PipelineUBOSet();
~PipelineUBOSet();
void clear();
void addRenderCommand(const RenderCommand &cmd);
size_t distanceToCommand(const RenderCommand &command) const;
std::vector<QRhiCommandBuffer::DynamicOffset> offsets(const RenderCommand &command) const;
std::vector<QRhiShaderResourceBinding> resourceLayout(const RHIShader *shader);
std::vector<QRhiShaderResourceBinding> resourceBindings(const RenderCommand &command);
bool allocateUBOs(SubmissionContext *ctx);
void uploadUBOs(SubmissionContext *ctx, RenderView *rv);
void setResourceManager(RHIResourceManagers *managers);
void setNodeManagers(NodeManagers *manager);
void initializeLayout(SubmissionContext *ctx, RHIShader *shader);
private:
void releaseResources();
void uploadUBOsForCommand(const RenderCommand &command,
size_t distanceToCommand);
void uploadShaderDataProperty(const ShaderData *shaderData,
const PipelineUBOSet::MultiUBOBufferWithBindingAndBlockSize *ubo,
const RHIShader::UBO_Member &uboMemberInstance,
size_t distanceToCommand, int arrayOffset = 0);
UBOBufferWithBindingAndBlockSize m_rvUBO; // Fixed size
MultiUBOBufferWithBindingAndBlockSize m_commandsUBO; // Variable size
std::vector<MultiUBOBufferWithBindingAndBlockSize> m_materialsUBOs; // Variable size
std::vector<ShaderStorageBlock> m_storageBlocks; // Fixed size
// TO DO: We also need to handle cases where UBO was directly provided by the frontend
// API and is not built up from Parameters
std::vector<const RenderCommand *> m_renderCommands;
RHIResourceManagers *m_resourceManagers = nullptr;
NodeManagers *m_nodeManagers = nullptr;
template<typename Pipeline, typename Key>
friend class RHIPipelineBase;
};
} // Rhi
} // Render
} // Qt3DRender
QT_END_NAMESPACE
#endif // QT3DRENDER_RENDER_RHI_PIPELINEUBOSET_H
|