Divide Framework 0.1
A free and open-source 3D Framework under heavy development
Loading...
Searching...
No Matches
Commands.cpp
Go to the documentation of this file.
1
2
3#include "Headers/Commands.h"
4#include "Headers/Pipeline.h"
5
8
13
14#include <bitset>
15
16namespace Divide {
17namespace GFX {
18
19static string ToString(const BindPipelineCommand& cmd, U16 indent)
20{
21 assert(cmd._pipeline != nullptr);
22
23 const auto blendStateToString = [](const BlendingSettings& state) -> string {
24 if (!state.enabled()) {
25 return "Disabled";
26 }
27
28 return Util::StringFormat("Blend Src[ {} ], Blend Dest[ {} ], Blend Op[ {} ], Blend Src Alpha[ {} ], Blend Dest Alpha[ {} ], Blend Op alpha[ {} ]",
29 Divide::Names::blendProperty[to_base(state.blendSrc())],
30 Divide::Names::blendProperty[to_base(state.blendDest())],
31 Divide::Names::blendOperation[to_base(state.blendOp())],
32 Divide::Names::blendProperty[to_base(state.blendSrcAlpha())],
33 Divide::Names::blendProperty[to_base(state.blendDestAlpha())],
34 Divide::Names::blendOperation[to_base(state.blendOpAlpha())]);
35 };
36
37 const auto attributeDescriptorToString = [](const U8 idx, const AttributeDescriptor& desc) -> string {
38 if (desc._dataType == GFXDataFormat::COUNT) {
39 return "Disabled";
40 }
41
42
43 return Util::StringFormat("Index [ {} ], Binding [ {} ], Components per element [ {} ], Component format [ {} ], Normalised [ {} ], Stride in bytes [ {} ]",
44 idx,
45 desc._vertexBindingIndex,
46 desc._componentsPerElement,
48 desc._normalized ? "True" : "False",
49 desc._strideInBytes);
50 };
51
52 const auto vertexFormatToString = []( const U8 idx, const VertexBinding& binding ) -> string
53 {
54 return Util::StringFormat("Index [ {} ] Binding [ {} ], Stride in bytes [ {} ], Per Vertex Input Rate [ {} ]",
55 idx,
56 binding._bufferBindIndex,
57 binding._strideInBytes,
58 binding._perVertexInputRate ? "True" : "False");
59 };
60
61 string ret = "\n";
62 for (U16 j = 0; j < indent; ++j) {
63 ret.append(" ");
64 }
65 ret.append(Util::StringFormat("Shader handle : {} - {}\n", cmd._pipeline->descriptor()._shaderProgramHandle._index, cmd._pipeline->descriptor()._shaderProgramHandle._generation));
66 ret.append(" ");
67 for (U16 j = 0; j < indent; ++j) {
68 ret.append(" ");
69 }
70 ret.append(Util::StringFormat("State hash : {}\n", cmd._pipeline->stateHash()));
71 ret.append(" ");
72 for (U16 j = 0; j < indent; ++j) {
73 ret.append(" ");
74 }
75 ShaderProgram* shader = Get(cmd._pipeline->descriptor()._shaderProgramHandle);
76 if (shader) {
77 ret.append(Util::StringFormat("Primitive topology : {}\n", Divide::Names::primitiveType[to_base(cmd._pipeline->descriptor()._primitiveTopology)]));
78 ret.append(" ");
79 for (U16 j = 0; j < indent; ++j) {
80 ret.append(" ");
81 }
82 }
83 {
84 ret.append("Blending states: \n");
85 indent += 1u;
86 const RTBlendStates& blendStates = cmd._pipeline->descriptor()._blendStates;
87 ret.append(" ");
88 for (U16 j = 0; j < indent; ++j) {
89 ret.append(" ");
90 }
91 ret.append(Util::StringFormat("Colour [ {}, {}, {}, {} ]\n", blendStates._blendColour.r, blendStates._blendColour.g, blendStates._blendColour.b, blendStates._blendColour.a));
92
93 U8 idx = 0u;
94 for (const BlendingSettings& state : blendStates._settings) {
95 ret.append(" ");
96 for (U16 j = 0; j < indent; ++j) {
97 ret.append(" ");
98 }
99 ret.append(Util::StringFormat("{}: {}\n", idx++, blendStateToString(state)));
100 }
101 indent -= 1u;
102 }
103 if (shader) {
104 ret.append(" ");
105 for (U16 j = 0; j < indent; ++j) {
106 ret.append(" ");
107 }
108 ret.append("Vertex format: \n");
109
110 indent += 1u;
111 U8 idx = 0u;
112 for (const AttributeDescriptor& desc : cmd._pipeline->descriptor()._vertexFormat._attributes) {
113 ret.append(" ");
114 for (U16 j = 0; j < indent; ++j) {
115 ret.append(" ");
116 }
117 ret.append(Util::StringFormat("{}: {}\n", idx, attributeDescriptorToString(idx, desc)));
118 ++idx;
119 }
120 idx = 0u;
121 for ( const VertexBinding& binding : cmd._pipeline->descriptor()._vertexFormat._vertexBindings )
122 {
123 ret.append( " " );
124 for ( U16 j = 0; j < indent; ++j )
125 {
126 ret.append( " " );
127 }
128 ret.append( Util::StringFormat( "{}: {}\n", idx, vertexFormatToString( idx, binding ) ) );
129 ++idx;
130 }
131 indent -= 1u;
132 }
133 return ret;
134}
135
136static string ToString(const SendPushConstantsCommand& cmd, U16 indent)
137{
138 string ret = "\n";
139
140 if ( cmd._uniformData != nullptr )
141 {
142 for (const auto& it : cmd._uniformData->entries())
143 {
144 ret.append(" ");
145 for (U16 j = 0; j < indent; ++j) {
146 ret.append(" ");
147 }
148 ret.append(Util::StringFormat("Constant binding: {} Type: {} Data range: [ {} - {} ]\n", it._bindingHash, to_base(it._type), it._range._startOffset, it._range._startOffset + it._range._length));
149 }
150 }
151 ret.append(" ");
152 for (U16 j = 0; j < indent; ++j) {
153 ret.append(" ");
154 }
155 ret.append(cmd._fastData.set() ? "Has push constants specified: \n" : "No push constant data specified");
156
157 if ( cmd._fastData.set() )
158 {
159 for (U8 d = 0u; d < 2u; ++d ) {
160 ret.append( " " );
161 for ( U16 j = 0; j < indent; ++j )
162 {
163 ret.append( " " );
164 }
165
166 const mat4<F32>& datad = cmd._fastData.data[d];
167 ret.append(Util::StringFormat("Data {}:\n", d));
168
169 indent += 1u;
170 for ( U8 r = 0u; r < 4; ++r )
171 {
172 ret.append( " " );
173 for ( U16 j = 0; j < indent; ++j )
174 {
175 ret.append( " " );
176 }
177
178 ret.append(Util::StringFormat(" {:.2f} {:.2f} {:.2f} {:.2f}\n", datad.m[r][0], datad.m[r][1], datad.m[r][2] , datad.m[r][3]));
179 }
180 indent -= 1u;
181 }
182 }
183
184 return ret;
185}
186
187static string ToString(const DrawCommand& cmd, const U16 indent)
188{
189 string ret = "\n";
190 size_t i = 0;
191 for (const GenericDrawCommand& drawCmd : cmd._drawCommands) {
192 ret.append(" ");
193 for (U16 j = 0; j < indent; ++j) {
194 ret.append(" ");
195 }
196 ret.append(Util::StringFormat("{}: Draw count: {} Base instance: {} Instance count: {} Index count: {}\n", i++, drawCmd._drawCount, drawCmd._cmd.baseInstance, drawCmd._cmd.instanceCount, drawCmd._cmd.indexCount));
197 }
198
199 return ret;
200}
201
202static string ToString(const SetViewportCommand& cmd, [[maybe_unused]] U16 indent)
203{
204 return Util::StringFormat(" [{}, {}, {}, {}]", cmd._viewport.x, cmd._viewport.y, cmd._viewport.z, cmd._viewport.w);
205}
206
207static string ToString(const PushViewportCommand& cmd, [[maybe_unused]] U16 indent)
208{
209 return Util::StringFormat(" [{}, {}, {}, {}]", cmd._viewport.x, cmd._viewport.y, cmd._viewport.z, cmd._viewport.w);
210}
211
212static string ToString(const BeginRenderPassCommand& cmd, U16 indent)
213{
214 string ret = "\n";
215 for ( U16 j = 0; j < indent; ++j )
216 {
217 ret.append( " " );
218 }
219 ret.append(Util::StringFormat(" Name: [ {} ] Target: [ {} ] Mip Level: [ {} ]: \n", cmd._name.c_str(), to_base(cmd._target), cmd._descriptor._mipWriteLevel));
220
221 U8 k = 0u;
222 for ( const bool draw : cmd._descriptor._drawMask )
223 {
224 ret.append( " " );
225 for ( U16 j = 0; j < indent; ++j )
226 {
227 ret.append( " " );
228 }
229 ret.append( Util::StringFormat( "Draw Mask[ {} ]: {}\n", k++, draw ? "TRUE" : "FALSE") );
230 }
231
232 k = 0u;
233 for ( const DrawLayerEntry& layer : cmd._descriptor._writeLayers )
234 {
235 ret.append( " " );
236 for ( U16 j = 0; j < indent; ++j )
237 {
238 ret.append( " " );
239 }
240 ret.append( Util::StringFormat( "Write Layer[ {} ]: [slice: {}, face: {}]\n", k++, layer._layer, layer._cubeFace ) );
241 }
242
243 k = 0u;
244 for ( const auto& clear : cmd._clearDescriptor )
245 {
246 ret.append( " " );
247 for ( U16 j = 0; j < indent; ++j )
248 {
249 ret.append( " " );
250 }
251 ret.append( Util::StringFormat("Clear Colour [ {:.2f}, {:.2f}, {:.2f}, {:.2f} ] (Enabled: {})\n", clear._colour.r, clear._colour.g, clear._colour.b, clear._colour.a, clear._enabled ? "TRUE" : "FALSE") );
252 }
253
254 return ret;
255}
256
257static string ToString(const SetScissorCommand& cmd, [[maybe_unused]] U16 indent)
258{
259 return Util::StringFormat(" [{}, {}, {}, {}]", cmd._rect.x, cmd._rect.y, cmd._rect.z, cmd._rect.w);
260}
261
262static string ToString(const SetClipPlanesCommand& cmd, const U16 indent) {
263 string ret = "\n";
264
265 auto& planes = cmd._clippingPlanes.planes();
266 auto& states = cmd._clippingPlanes.planeState();
267 for (U8 i = 0; i < to_U8(ClipPlaneIndex::COUNT); ++i) {
268 if (states[i]) {
269 ret.append(" ");
270 for (U16 j = 0; j < indent; ++j) {
271 ret.append(" ");
272 }
273
274 const vec4<F32>& eq = planes[i]._equation;
275
276 ret.append(Util::StringFormat("Plane [{}] [ {:5.2f} {:5.2f} {:5.2f} - {:5.2f} ]\n", i, eq.x, eq.y, eq.z, eq.w));
277 }
278 }
279
280 return ret;
281}
282
283static string ToString(const SetCameraCommand& cmd, [[maybe_unused]] U16 indent) {
284 string ret = " ";
285 ret.append(Util::StringFormat("[ Camera position (eye): [ {:5.2f} {:5.2f} {:5.2f}]\n", cmd._cameraSnapshot._eye.x, cmd._cameraSnapshot._eye.y, cmd._cameraSnapshot._eye.z));
286 return ret;
287}
288
289static string ToString(const BindShaderResourcesCommand& cmd, const U16 indent)
290{
291 U8 bufferCount = 0u;
292 U8 imageCount = 0u;
293 for (U8 i = 0u; i < cmd._set._bindingCount; ++i)
294 {
295 const DescriptorSetBinding& binding = cmd._set._bindings[i];
296
299 {
300 ++bufferCount;
301 }
304 {
305 ++imageCount;
306 }
307 }
308
309 string ret = Util::StringFormat(" [ Buffers: {}, Images: {} ]\n", bufferCount, imageCount);
310
311 for ( U8 i = 0u; i < cmd._set._bindingCount; ++i )
312 {
313 const DescriptorSetBinding& binding = cmd._set._bindings[i];
314
317 {
318 ret.append( " " );
319 for (U16 j = 0; j < indent; ++j)
320 {
321 ret.append(" ");
322 }
323
324 ret.append(Util::StringFormat("Buffer [ {} - {} ] Range [{} - {}] Read Index [ {} ]\n",
325 binding._slot,
326 binding._data._buffer._buffer->getGUID(),
328 binding._data._buffer._range._length,
329 binding._data._buffer._queueReadIndex));
330 }
331 }
332
333 for ( U8 i = 0u; i < cmd._set._bindingCount; ++i )
334 {
335 const DescriptorSetBinding& binding = cmd._set._bindings[i];
336
339 {
340 if (binding._slot == INVALID_TEXTURE_BINDING)
341 {
342 continue;
343 }
344
345 ret.append(" ");
346 for (U16 j = 0; j < indent; ++j)
347 {
348 ret.append(" ");
349 }
350
352 {
353 const DescriptorCombinedImageSampler& sampledImage = binding._data._sampledImage;
354 const Texture* srcTex = sampledImage._image._srcTexture;
355
356 ret.append(Util::StringFormat("Texture [ {} - {} - {} - {} ] Layers: [ {} - {} ] MipRange: [ {} - {} ]\n",
357 binding._slot,
358 srcTex != nullptr ? srcTex->getGUID() : 0u,
359 srcTex != nullptr ? srcTex->resourceName().c_str() : "no-name",
360 GetHash(sampledImage._sampler),
361 sampledImage._image._subRange._layerRange._offset,
362 sampledImage._image._subRange._layerRange._count,
363 sampledImage._image._subRange._mipLevels._offset,
364 sampledImage._image._subRange._mipLevels._count));
365 }
366 else
367 {
368 const DescriptorImageView& imageView = binding._data._imageView;
369 const Texture* srcTex = imageView._image._srcTexture;
370
371 ret.append(Util::StringFormat("Image binds: Slot [{}] - Src GUID [ {} ] - Src Name [ {} ] - Layers [{} - {}] - Levels [{} - {}] - Flag [ {} ]",
372 binding._slot,
373 srcTex != nullptr ? srcTex->getGUID() : 0u,
374 srcTex != nullptr ? srcTex->resourceName().c_str() : "no-name",
380 }
381 }
382 }
383
384 return ret;
385}
386
387static string ToString(const BeginDebugScopeCommand& cmd, [[maybe_unused]] const U16 indent)
388{
389 return " [ " + string(cmd._scopeName.c_str()) + " ]";
390}
391
392static string ToString(const AddDebugMessageCommand& cmd, const U16 indent)
393{
394 string ret = "\n";
395 for (U16 j = 0; j < indent; ++j) {
396 ret.append(" ");
397 }
398
399 ret.append( " [ " + string(cmd._msg.c_str()) + " ]");
400 return ret;
401}
402
403static string ToString(const DispatchComputeCommand& cmd, [[maybe_unused]] U16 indent)
404{
405 return Util::StringFormat(" [ Group sizes: {} {} {}]", cmd._computeGroupSize.x, cmd._computeGroupSize.y, cmd._computeGroupSize.z);
406}
407
408static string ToString(const MemoryBarrierCommand& cmd, U16 indent) {
409 string ret = Util::StringFormat(" [ Buffer locks: {} ] [ Texture layout changes: {} ]\n",
410 cmd._bufferLocks.size(),
411 cmd._textureLayoutChanges.size());
412
413 for (auto it : cmd._bufferLocks) {
414 ret.append(" ");
415 for (U16 j = 0; j < indent; ++j) {
416 ret.append(" ");
417 }
418
419 const I64 guid = it._buffer != nullptr ? it._buffer->getGUID() : -1;
420
421 ret.append(Util::StringFormat("Buffer lock: [ {} - [{} - {}] ] - Type [ {} ]\n", guid, it._range._startOffset, it._range._length, Divide::Names::bufferUpdateUsage[to_base(it._type)]));
422 }
423
424 for (auto it : cmd._textureLayoutChanges) {
425 ret.append(" ");
426 for (U16 j = 0; j < indent; ++j) {
427 ret.append(" ");
428 }
429 ret.append(Util::StringFormat("Texture Layout Change: [ {} [ {} -> {} ]]\n", it._targetView._srcTexture ? it._targetView._srcTexture->getGUID() : -1, Divide::Names::imageUsage[to_base( it._sourceLayout )], Divide::Names::imageUsage[to_base(it._targetLayout)]));
430 }
431 return ret;
432}
433
434static string ToString( const BeginGPUQueryCommand& cmd, [[maybe_unused]] const U16 indent )
435{
436 string ret = " Bit Mask: ";
437 ret.append( std::bitset<32>(cmd._queryMask).to_string() );
438 return ret;
439}
440
441static string ToString( const EndGPUQueryCommand& cmd, [[maybe_unused]] const U16 indent )
442{
443 return cmd._waitForResults ? " Wait for results: TRUE" : " Wait for results: FALSE";
444}
445
446static string ToString( const BlitRenderTargetCommand& cmd, const U16 indent )
447{
448 string ret = Util::StringFormat("Source ID [ {} ] Target ID [ {} ] Param count [ {} ]\n", cmd._source, cmd._destination, cmd._params.size());
449 for ( auto it : cmd._params )
450 {
451 ret.append( " " );
452 for ( U16 j = 0; j < indent; ++j )
453 {
454 ret.append( " " );
455 }
456
457 ret.append( Util::StringFormat( "Input: [l: {} m: {} i: {}] Output: [l: {} m: {} i: {}] Layer count: [ {} ] Mip Count: [ {} ]\n", it._input._layerOffset, it._input._mipOffset, it._input._index, it._output._layerOffset, it._output._mipOffset, it._output._index, it._layerCount, it._mipCount ) );
458 }
459
460 return ret;
461}
462
463static string ToString( [[maybe_unused]] const CopyTextureCommand& cmd, [[maybe_unused]] const U16 indent )
464{
465 return "ToDo";
466}
467
468static string ToString( [[maybe_unused]] const ReadTextureCommand& cmd, [[maybe_unused]] const U16 indent )
469{
470 return "ToDo";
471}
472
473static string ToString( [[maybe_unused]] const ClearTextureCommand& cmd, [[maybe_unused]] const U16 indent )
474{
475 return "ToDo";
476}
477
478static string ToString( [[maybe_unused]] const ComputeMipMapsCommand& cmd, [[maybe_unused]] const U16 indent )
479{
480 return "ToDo";
481}
482
483static string ToString( [[maybe_unused]] const PushCameraCommand& cmd, [[maybe_unused]] const U16 indent )
484{
485 return "ToDo";
486}
487
488static string ToString( [[maybe_unused]] const ReadBufferDataCommand& cmd, [[maybe_unused]] const U16 indent )
489{
490 return "ToDo";
491}
492
493static string ToString( [[maybe_unused]] const ClearBufferDataCommand& cmd, [[maybe_unused]] const U16 indent )
494{
495 return "ToDo";
496}
497
498string ToString(const CommandBase& cmd, const CommandType type, U16 indent) {
499 string ret(indent, ' ');
500 ret.append(Names::commandType[to_base( type )]);
501
502 indent += 3u;
503 switch ( type ) {
505 {
506 ret.append(ToString(static_cast<const BeginRenderPassCommand&>(cmd), indent));
507 }break;
510 {
511 ret.append(ToString(static_cast<const BeginGPUQueryCommand&>(cmd), indent));
512 }break;
514 {
515 ret.append(ToString(static_cast<const EndGPUQueryCommand&>(cmd), indent));
516 }break;
518 {
519 ret.append(ToString(static_cast<const SetViewportCommand&>(cmd), indent));
520 }break;
522 {
523 ret.append(ToString(static_cast<const PushViewportCommand&>(cmd), indent));
524 }break;
525 case CommandType::POP_VIEWPORT: break;
527 {
528 ret.append(ToString(static_cast<const SetScissorCommand&>(cmd), indent));
529 }break;
531 {
532 ret.append(ToString(static_cast<const BlitRenderTargetCommand&>(cmd), indent));
533 }break;
535 {
536 ret.append( ToString( static_cast<const CopyTextureCommand&>(cmd), indent ) );
537 }break;
539 {
540 ret.append( ToString( static_cast<const ReadTextureCommand&>(cmd), indent ) );
541 }break;
543 {
544 ret.append( ToString( static_cast<const ClearTextureCommand&>(cmd), indent ) );
545 }break;
547 {
548 ret.append( ToString( static_cast<const ComputeMipMapsCommand&>(cmd), indent ) );
549 }break;
551 {
552 ret.append(ToString(static_cast<const SetCameraCommand&>(cmd), indent));
553 }break;
555 {
556 ret.append(ToString(static_cast<const PushCameraCommand&>(cmd), indent));
557 }break;
558 case CommandType::POP_CAMERA: break;
560 {
561 ret.append(ToString(static_cast<const SetClipPlanesCommand&>(cmd), indent));
562 }break;
564 ret.append(ToString(static_cast<const BindPipelineCommand&>(cmd), indent));
565 }break;
567 {
568 ret.append(ToString(static_cast<const BindShaderResourcesCommand&>(cmd), indent));
569 }break;
571 {
572 ret.append(ToString(static_cast<const SendPushConstantsCommand&>(cmd), indent));
573 }break;
575 {
576 ret.append(ToString(static_cast<const DrawCommand&>(cmd), indent));
577 }break;
579 {
580 ret.append(ToString(static_cast<const DispatchComputeCommand&>(cmd), indent));
581 }break;
583 {
584 ret.append(ToString(static_cast<const MemoryBarrierCommand&>(cmd), indent));
585 }break;
587 {
588 ret.append(ToString(static_cast<const ReadBufferDataCommand&>(cmd), indent));
589 }break;
591 {
592 ret.append(ToString(static_cast<const ClearBufferDataCommand&>(cmd), indent));
593 }break;
595 {
596 ret.append(ToString(static_cast<const BeginDebugScopeCommand&>(cmd), indent));
597 }break;
600 {
601 ret.append(ToString(static_cast<const AddDebugMessageCommand&>(cmd), indent));
602 }break;
603 default: break;
604 }
605 return ret;
606}
607
608} //namespace GFX
609} //namespace Divide
FORCE_INLINE I64 getGUID() const noexcept
Definition: GUIDWrapper.h:51
An API-independent representation of a texture.
Definition: Texture.h:83
static const char * commandType[]
Definition: CommandTypes.h:73
void ToString(const CommandBase &cmd, const CommandType type, I32 &crtIndent, string &out)
CommandBuffer * Get(Handle< CommandBuffer > handle)
static constexpr const char * blendProperty[]
static constexpr const char * bufferUpdateUsage[]
static constexpr const char * imageUsage[]
static constexpr const char * GFXDataFormat[]
static constexpr const char * primitiveType[]
static constexpr const char * blendOperation[]
Str StringFormat(const char *fmt, Args &&...args)
Handle console commands that start with a forward slash.
Definition: AIProcessor.cpp:7
uint8_t U8
size_t GetHash(const PropertyDescriptor< T > &descriptor) noexcept
Definition: Resource.inl:40
constexpr U8 INVALID_TEXTURE_BINDING
uint16_t U16
constexpr U8 to_U8(const T value)
std::basic_string< char, std::char_traits< char >, dvd_allocator< char > > string
Definition: STLString.h:41
int64_t I64
constexpr auto to_base(const Type value) -> Type
const std::array< bool, N > & planeState() const noexcept
Definition: ClipPlanes.h:76
const PlaneList< N > & planes() const noexcept
Definition: ClipPlanes.h:75
DescriptorSetBindingType _type
DescriptorCombinedImageSampler _sampledImage
DescriptorSetBindingData _data
std::array< DescriptorSetBinding, MAX_BINDINGS_PER_DESCRIPTOR_SET > _bindings
U8 _cubeFace
Ignored for non cube textures.
U16 _layer
RTClearDescriptor _clearDescriptor
Definition: Commands.inl:97
GenericDrawCommandContainer _drawCommands
Definition: Commands.inl:81
TextureLayoutChanges _textureLayoutChanges
Definition: Commands.inl:191
CameraSnapshot _cameraSnapshot
Definition: Commands.inl:155
FrustumClipPlanes _clippingPlanes
Definition: Commands.inl:165
IndirectIndexedDrawCommand _cmd
ImageSubRange _subRange
const Texture * _srcTexture
bool set() const noexcept
Definition: PushConstants.h:44
std::array< BlendingSettings, to_base(RTColourAttachmentSlot::COUNT)> _settings
DrawLayerEntry _writeLayers[RT_MAX_ATTACHMENT_COUNT]
BufferRange _range
I32 _queueReadIndex
ShaderBuffer * _buffer
const UniformDataContainer & entries() const noexcept