yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

jarcherNVAdd record and replay support for IComponentType2 (#8215)a5e6ddd00

master
22.4 KiB631 linesraw
1#ifndef REPLAY_CONSUMER_H
2#define REPLAY_CONSUMER_H
3
4#include "../../core/slang-stream.h"
5#include "../util/record-format.h"
6#include "../util/record-utility.h"
7#include "decoder-consumer.h"
8
9#include <unordered_map>
10
11namespace SlangRecord
12{
13// class CommonInterfaceReplayer;
14
15class CommonInterfaceReplayer
16{
17public:
18    CommonInterfaceReplayer(Slang::Dictionary<ObjectID, void*>& pObjectMap)
19        : m_objectMap(pObjectMap)
20    {
21    }
22    virtual ~CommonInterfaceReplayer() = default;
23
24    SlangResult getSession(ObjectID objectId, ObjectID outSessionId) { return SLANG_FAIL; }
25
26    SlangResult getLayout(
27        ObjectID objectId,
28        SlangInt targetIndex,
29        ObjectID outDiagnosticsId,
30        ObjectID retProgramLayoutId);
31    SlangResult getEntryPointCode(
32        ObjectID objectId,
33        SlangInt entryPointIndex,
34        SlangInt targetIndex,
35        ObjectID outCodeId,
36        ObjectID outDiagnosticsId);
37    SlangResult getTargetCode(
38        ObjectID objectId,
39        SlangInt targetIndex,
40        ObjectID outCodeId,
41        ObjectID outDiagnosticsId);
42    SlangResult getResultAsFileSystem(
43        ObjectID objectId,
44        SlangInt entryPointIndex,
45        SlangInt targetIndex,
46        ObjectID outFileSystemId);
47    SlangResult getEntryPointHash(
48        ObjectID objectId,
49        SlangInt entryPointIndex,
50        SlangInt targetIndex,
51        ObjectID outHashId);
52    SlangResult specialize(
53        ObjectID objectId,
54        slang::SpecializationArg const* specializationArgs,
55        SlangInt specializationArgCount,
56        ObjectID outSpecializedComponentTypeId,
57        ObjectID outDiagnosticsId);
58    SlangResult link(
59        ObjectID objectId,
60        ObjectID outLinkedComponentTypeId,
61        ObjectID outDiagnosticsId);
62    SlangResult getEntryPointHostCallable(
63        ObjectID objectId,
64        int entryPointIndex,
65        int targetIndex,
66        ObjectID outSharedLibraryId,
67        ObjectID outDiagnosticsId);
68    SlangResult renameEntryPoint(ObjectID objectId, const char* newName, ObjectID outEntryPointId);
69    SlangResult linkWithOptions(
70        ObjectID objectId,
71        ObjectID outLinkedComponentTypeId,
72        uint32_t compilerOptionEntryCount,
73        slang::CompilerOptionEntry* compilerOptionEntries,
74        ObjectID outDiagnosticsId);
75
76    SlangResult queryInterface(ObjectID objectId, const SlangUUID& guid, ObjectID outInterfaceId);
77
78    // IComponentType2 methods.
79    SlangResult getTargetCompileResult(
80        ObjectID objectId,
81        SlangInt targetIndex,
82        ObjectID outCompileResultId,
83        ObjectID outDiagnosticsId);
84    SlangResult getEntryPointCompileResult(
85        ObjectID objectId,
86        SlangInt entryPointIndex,
87        SlangInt targetIndex,
88        ObjectID outCompileResultId,
89        ObjectID outDiagnosticsId);
90
91private:
92    inline slang::IComponentType* getObjectPointer(ObjectID objectId)
93    {
94        void* objPtr = nullptr;
95
96        // If the object is not found, there must be something wrong with the record/replay
97        // logic, so report an error.
98        if (!m_objectMap.tryGetValue(objectId, objPtr))
99        {
100            slangRecordLog(LogLevel::Error, "Object not found in the object map: %d\n", objectId);
101            std::abort();
102        }
103
104        return static_cast<slang::IComponentType*>(objPtr);
105    }
106
107    inline slang::IComponentType2* getObjectPointer2(ObjectID objectId)
108    {
109        void* objPtr = nullptr;
110
111        // If the object is not found, there must be something wrong with the record/replay
112        // logic, so report an error.
113        if (!m_objectMap.tryGetValue(objectId, objPtr))
114        {
115            slangRecordLog(LogLevel::Error, "Object not found in the object map: %d\n", objectId);
116            std::abort();
117        }
118
119        return static_cast<slang::IComponentType2*>(objPtr);
120    }
121
122    Slang::Dictionary<ObjectID, void*>& m_objectMap;
123    uint32_t m_globalCounter = 0;
124};
125
126class ReplayConsumer : public IDecoderConsumer, public Slang::RefObject
127{
128public:
129    virtual void CreateGlobalSession(
130        SlangGlobalSessionDesc const& desc,
131        ObjectID outGlobalSessionId) override;
132    virtual void IGlobalSession_createSession(
133        ObjectID objectId,
134        slang::SessionDesc const& desc,
135        ObjectID outSessionId) override;
136    virtual void IGlobalSession_findProfile(ObjectID objectId, char const* name) override;
137    virtual void IGlobalSession_setDownstreamCompilerPath(
138        ObjectID objectId,
139        SlangPassThrough passThrough,
140        char const* path) override;
141    virtual void IGlobalSession_setDownstreamCompilerPrelude(
142        ObjectID objectId,
143        SlangPassThrough inPassThrough,
144        char const* prelude) override;
145    virtual void IGlobalSession_getDownstreamCompilerPrelude(
146        ObjectID objectId,
147        SlangPassThrough inPassThrough,
148        ObjectID outPreludeId) override;
149
150    virtual void IGlobalSession_getBuildTagString(ObjectID objectId) override { (void)objectId; }
151
152    virtual void IGlobalSession_setDefaultDownstreamCompiler(
153        ObjectID objectId,
154        SlangSourceLanguage sourceLanguage,
155        SlangPassThrough defaultCompiler) override;
156    virtual void IGlobalSession_getDefaultDownstreamCompiler(
157        ObjectID objectId,
158        SlangSourceLanguage sourceLanguage) override;
159    virtual void IGlobalSession_setLanguagePrelude(
160        ObjectID objectId,
161        SlangSourceLanguage inSourceLanguage,
162        char const* prelude) override;
163    virtual void IGlobalSession_getLanguagePrelude(
164        ObjectID objectId,
165        SlangSourceLanguage inSourceLanguage,
166        ObjectID outPreludeId) override;
167    virtual void IGlobalSession_createCompileRequest(ObjectID objectId, ObjectID outCompileRequest)
168        override;
169    virtual void IGlobalSession_addBuiltins(
170        ObjectID objectId,
171        char const* sourcePath,
172        char const* sourceString) override;
173    virtual void IGlobalSession_setSharedLibraryLoader(ObjectID objectId, ObjectID loaderId)
174        override;
175    virtual void IGlobalSession_getSharedLibraryLoader(ObjectID objectId, ObjectID outLoaderId)
176        override;
177    virtual void IGlobalSession_checkCompileTargetSupport(
178        ObjectID objectId,
179        SlangCompileTarget target) override;
180    virtual void IGlobalSession_checkPassThroughSupport(
181        ObjectID objectId,
182        SlangPassThrough passThrough) override;
183    virtual void IGlobalSession_compileCoreModule(
184        ObjectID objectId,
185        slang::CompileCoreModuleFlags flags) override;
186    virtual void IGlobalSession_loadCoreModule(
187        ObjectID objectId,
188        const void* coreModule,
189        size_t coreModuleSizeInBytes) override;
190    virtual void IGlobalSession_saveCoreModule(
191        ObjectID objectId,
192        SlangArchiveType archiveType,
193        ObjectID outBlobId) override;
194    virtual void IGlobalSession_findCapability(ObjectID objectId, char const* name) override;
195    virtual void IGlobalSession_setDownstreamCompilerForTransition(
196        ObjectID objectId,
197        SlangCompileTarget source,
198        SlangCompileTarget target,
199        SlangPassThrough compiler) override;
200    virtual void IGlobalSession_getDownstreamCompilerForTransition(
201        ObjectID objectId,
202        SlangCompileTarget source,
203        SlangCompileTarget target) override;
204
205    virtual void IGlobalSession_getCompilerElapsedTime(ObjectID objectId) override
206    {
207        (void)objectId;
208    }
209
210    virtual void IGlobalSession_setSPIRVCoreGrammar(ObjectID objectId, char const* jsonPath)
211        override;
212    virtual void IGlobalSession_parseCommandLineArguments(
213        ObjectID objectId,
214        int argc,
215        const char* const* argv,
216        ObjectID outSessionDescId,
217        ObjectID outAllocationId) override;
218    virtual void IGlobalSession_getSessionDescDigest(
219        ObjectID objectId,
220        slang::SessionDesc* sessionDesc,
221        ObjectID outBlobId) override;
222
223    // ISession
224    virtual void ISession_getGlobalSession(ObjectID objectId, ObjectID outGlobalSessionId) override;
225    virtual void ISession_loadModule(
226        ObjectID objectId,
227        const char* moduleName,
228        ObjectID outDiagnostics,
229        ObjectID outModuleId) override;
230
231    virtual void ISession_loadModuleFromIRBlob(
232        ObjectID objectId,
233        const char* moduleName,
234        const char* path,
235        slang::IBlob* source,
236        ObjectID outDiagnosticsId,
237        ObjectID outModuleId) override;
238    virtual void ISession_loadModuleFromSource(
239        ObjectID objectId,
240        const char* moduleName,
241        const char* path,
242        slang::IBlob* source,
243        ObjectID outDiagnosticsId,
244        ObjectID outModuleId) override;
245    virtual void ISession_loadModuleFromSourceString(
246        ObjectID objectId,
247        const char* moduleName,
248        const char* path,
249        const char* string,
250        ObjectID outDiagnosticsId,
251        ObjectID outModuleId) override;
252    virtual void ISession_createCompositeComponentType(
253        ObjectID objectId,
254        ObjectID* componentTypeIds,
255        SlangInt componentTypeCount,
256        ObjectID outCompositeComponentTypeIds,
257        ObjectID outDiagnosticsId) override;
258
259    virtual void ISession_specializeType(
260        ObjectID objectId,
261        ObjectID typeId,
262        slang::SpecializationArg const* specializationArgs,
263        SlangInt specializationArgCount,
264        ObjectID outDiagnosticsId,
265        ObjectID outTypeReflectionId) override;
266
267    virtual void ISession_getTypeLayout(
268        ObjectID objectId,
269        ObjectID typeId,
270        SlangInt targetIndex,
271        slang::LayoutRules rules,
272        ObjectID outDiagnosticsId,
273        ObjectID outTypeLayoutReflection) override;
274
275    virtual void ISession_getContainerType(
276        ObjectID objectId,
277        ObjectID elementType,
278        slang::ContainerType containerType,
279        ObjectID outDiagnosticsId,
280        ObjectID outTypeReflectionId) override;
281
282    virtual void ISession_getDynamicType(ObjectID objectId, ObjectID outTypeReflectionId) override;
283
284    virtual void ISession_getTypeRTTIMangledName(
285        ObjectID objectId,
286        ObjectID typeId,
287        ObjectID outNameBlobId) override;
288
289    virtual void ISession_getTypeConformanceWitnessMangledName(
290        ObjectID objectId,
291        ObjectID typeId,
292        ObjectID interfaceTypeId,
293        ObjectID outNameBlobId) override;
294
295    virtual void ISession_getTypeConformanceWitnessSequentialID(
296        ObjectID objectId,
297        ObjectID typeId,
298        ObjectID interfaceTypeId,
299        uint32_t outId) override;
300
301    virtual void ISession_createTypeConformanceComponentType(
302        ObjectID objectId,
303        ObjectID typeId,
304        ObjectID interfaceTypeId,
305        ObjectID outConformanceId,
306        SlangInt conformanceIdOverride,
307        ObjectID outDiagnosticsId) override;
308
309    virtual void ISession_createCompileRequest(ObjectID objectId, ObjectID outCompileRequestId)
310        override;
311
312    virtual void ISession_getLoadedModuleCount(ObjectID objectId) override { (void)objectId; }
313
314    virtual void ISession_getLoadedModule(ObjectID objectId, SlangInt index, ObjectID outModuleId)
315        override;
316
317    virtual void ISession_isBinaryModuleUpToDate(ObjectID objectId) override { (void)objectId; }
318
319    // IModule
320    virtual void IModule_findEntryPointByName(
321        ObjectID objectId,
322        char const* name,
323        ObjectID outEntryPointId) override;
324
325    virtual void IModule_getDefinedEntryPointCount(ObjectID objectId) override { (void)objectId; }
326
327    virtual void IModule_getDefinedEntryPoint(
328        ObjectID objectId,
329        SlangInt32 index,
330        ObjectID outEntryPointId) override;
331    virtual void IModule_serialize(ObjectID objectId, ObjectID outSerializedBlobId) override;
332    virtual void IModule_writeToFile(ObjectID objectId, char const* fileName) override;
333
334    virtual void IModule_getName(ObjectID objectId) override { (void)objectId; }
335    virtual void IModule_getFilePath(ObjectID objectId) override { (void)objectId; }
336    virtual void IModule_getUniqueIdentity(ObjectID objectId) override { (void)objectId; }
337
338    virtual void IModule_findAndCheckEntryPoint(
339        ObjectID objectId,
340        char const* name,
341        SlangStage stage,
342        ObjectID outEntryPointId,
343        ObjectID outDiagnostics) override;
344
345    virtual void IModule_getSession(ObjectID objectId, ObjectID outSessionId) override;
346    virtual void IModule_getLayout(
347        ObjectID objectId,
348        SlangInt targetIndex,
349        ObjectID outDiagnosticsId,
350        ObjectID retProgramLayoutId) override;
351
352    virtual void IModule_getSpecializationParamCount(ObjectID objectId) override { (void)objectId; }
353
354    virtual void IModule_getEntryPointCode(
355        ObjectID objectId,
356        SlangInt entryPointIndex,
357        SlangInt targetIndex,
358        ObjectID outCodeId,
359        ObjectID outDiagnosticsId) override;
360    virtual void IModule_getTargetCode(
361        ObjectID objectId,
362        SlangInt targetIndex,
363        ObjectID outCodeId,
364        ObjectID outDiagnosticsId) override;
365    virtual void IModule_getResultAsFileSystem(
366        ObjectID objectId,
367        SlangInt entryPointIndex,
368        SlangInt targetIndex,
369        ObjectID outFileSystem) override;
370    virtual void IModule_getEntryPointHash(
371        ObjectID objectId,
372        SlangInt entryPointIndex,
373        SlangInt targetIndex,
374        ObjectID outHashId) override;
375    virtual void IModule_specialize(
376        ObjectID objectId,
377        slang::SpecializationArg const* specializationArgs,
378        SlangInt specializationArgCount,
379        ObjectID outSpecializedComponentTypeId,
380        ObjectID outDiagnosticsId) override;
381    virtual void IModule_link(
382        ObjectID objectId,
383        ObjectID outLinkedComponentTypeId,
384        ObjectID outDiagnosticsId) override;
385    virtual void IModule_getEntryPointHostCallable(
386        ObjectID objectId,
387        int entryPointIndex,
388        int targetIndex,
389        ObjectID outSharedLibrary,
390        ObjectID outDiagnostics) override;
391    virtual void IModule_renameEntryPoint(
392        ObjectID objectId,
393        const char* newName,
394        ObjectID outEntryPointId) override;
395    virtual void IModule_linkWithOptions(
396        ObjectID objectId,
397        ObjectID outLinkedComponentTypeId,
398        uint32_t compilerOptionEntryCount,
399        slang::CompilerOptionEntry* compilerOptionEntries,
400        ObjectID outDiagnosticsId) override;
401
402    // IEntryPoint
403    virtual void IEntryPoint_getSession(ObjectID objectId, ObjectID outSessionId) override;
404    virtual void IEntryPoint_getLayout(
405        ObjectID objectId,
406        SlangInt targetIndex,
407        ObjectID outDiagnosticsId,
408        ObjectID retProgramLayoutId) override;
409
410    virtual void IEntryPoint_getSpecializationParamCount(ObjectID objectId) override
411    {
412        (void)objectId;
413    };
414
415    virtual void IEntryPoint_getEntryPointCode(
416        ObjectID objectId,
417        SlangInt entryPointIndex,
418        SlangInt targetIndex,
419        ObjectID outCodeId,
420        ObjectID outDiagnosticsId) override;
421    virtual void IEntryPoint_getTargetCode(
422        ObjectID objectId,
423        SlangInt targetIndex,
424        ObjectID outCodeId,
425        ObjectID outDiagnosticsId) override;
426    virtual void IEntryPoint_getResultAsFileSystem(
427        ObjectID objectId,
428        SlangInt entryPointIndex,
429        SlangInt targetIndex,
430        ObjectID outFileSystem) override;
431    virtual void IEntryPoint_getEntryPointHash(
432        ObjectID objectId,
433        SlangInt entryPointIndex,
434        SlangInt targetIndex,
435        ObjectID outHashId) override;
436    virtual void IEntryPoint_specialize(
437        ObjectID objectId,
438        slang::SpecializationArg const* specializationArgs,
439        SlangInt specializationArgCount,
440        ObjectID outSpecializedComponentTypeId,
441        ObjectID outDiagnosticsId) override;
442    virtual void IEntryPoint_link(
443        ObjectID objectId,
444        ObjectID outLinkedComponentTypeId,
445        ObjectID outDiagnosticsId) override;
446    virtual void IEntryPoint_getEntryPointHostCallable(
447        ObjectID objectId,
448        int entryPointIndex,
449        int targetIndex,
450        ObjectID outSharedLibrary,
451        ObjectID outDiagnostics) override;
452    virtual void IEntryPoint_renameEntryPoint(
453        ObjectID objectId,
454        const char* newName,
455        ObjectID outEntryPointId) override;
456    virtual void IEntryPoint_linkWithOptions(
457        ObjectID objectId,
458        ObjectID outLinkedComponentTypeId,
459        uint32_t compilerOptionEntryCount,
460        slang::CompilerOptionEntry* compilerOptionEntries,
461        ObjectID outDiagnosticsId) override;
462
463    // ICompositeComponentType
464    virtual void ICompositeComponentType_getSession(ObjectID objectId, ObjectID outSessionId)
465        override;
466    virtual void ICompositeComponentType_getLayout(
467        ObjectID objectId,
468        SlangInt targetIndex,
469        ObjectID outDiagnosticsId,
470        ObjectID retProgramLayoutId) override;
471
472    virtual void ICompositeComponentType_getSpecializationParamCount(ObjectID objectId) override
473    {
474        (void)objectId;
475    };
476
477    virtual void ICompositeComponentType_getEntryPointCode(
478        ObjectID objectId,
479        SlangInt entryPointIndex,
480        SlangInt targetIndex,
481        ObjectID outCodeId,
482        ObjectID outDiagnosticsId) override;
483    virtual void ICompositeComponentType_getTargetCode(
484        ObjectID objectId,
485        SlangInt targetIndex,
486        ObjectID outCodeId,
487        ObjectID outDiagnosticsId) override;
488    virtual void ICompositeComponentType_getResultAsFileSystem(
489        ObjectID objectId,
490        SlangInt entryPointIndex,
491        SlangInt targetIndex,
492        ObjectID outFileSystem) override;
493    virtual void ICompositeComponentType_getEntryPointHash(
494        ObjectID objectId,
495        SlangInt entryPointIndex,
496        SlangInt targetIndex,
497        ObjectID outHashId) override;
498    virtual void ICompositeComponentType_specialize(
499        ObjectID objectId,
500        slang::SpecializationArg const* specializationArgs,
501        SlangInt specializationArgCount,
502        ObjectID outSpecializedComponentTypeId,
503        ObjectID outDiagnosticsId) override;
504    virtual void ICompositeComponentType_link(
505        ObjectID objectId,
506        ObjectID outLinkedComponentTypeId,
507        ObjectID outDiagnosticsId) override;
508    virtual void ICompositeComponentType_getEntryPointHostCallable(
509        ObjectID objectId,
510        int entryPointIndex,
511        int targetIndex,
512        ObjectID outSharedLibrary,
513        ObjectID outDiagnostics) override;
514    virtual void ICompositeComponentType_renameEntryPoint(
515        ObjectID objectId,
516        const char* newName,
517        ObjectID outEntryPointId) override;
518    virtual void ICompositeComponentType_linkWithOptions(
519        ObjectID objectId,
520        ObjectID outLinkedComponentTypeId,
521        uint32_t compilerOptionEntryCount,
522        slang::CompilerOptionEntry* compilerOptionEntries,
523        ObjectID outDiagnosticsId) override;
524
525    virtual void ICompositeComponentType_queryInterface(
526        ObjectID objectId,
527        const SlangUUID& guid,
528        ObjectID outInterfaceId) override;
529
530    // ITypeConformance
531    virtual void ITypeConformance_getSession(ObjectID objectId, ObjectID outSessionId) override;
532    virtual void ITypeConformance_getLayout(
533        ObjectID objectId,
534        SlangInt targetIndex,
535        ObjectID outDiagnosticsId,
536        ObjectID retProgramLayoutId) override;
537
538    virtual void ITypeConformance_getSpecializationParamCount(ObjectID objectId) override
539    {
540        (void)objectId;
541    };
542
543    virtual void ITypeConformance_getEntryPointCode(
544        ObjectID objectId,
545        SlangInt entryPointIndex,
546        SlangInt targetIndex,
547        ObjectID outCodeId,
548        ObjectID outDiagnosticsId) override;
549    virtual void ITypeConformance_getTargetCode(
550        ObjectID objectId,
551        SlangInt targetIndex,
552        ObjectID outCodeId,
553        ObjectID outDiagnosticsId) override;
554    virtual void ITypeConformance_getResultAsFileSystem(
555        ObjectID objectId,
556        SlangInt entryPointIndex,
557        SlangInt targetIndex,
558        ObjectID outFileSystem) override;
559    virtual void ITypeConformance_getEntryPointHash(
560        ObjectID objectId,
561        SlangInt entryPointIndex,
562        SlangInt targetIndex,
563        ObjectID outHashId) override;
564    virtual void ITypeConformance_specialize(
565        ObjectID objectId,
566        slang::SpecializationArg const* specializationArgs,
567        SlangInt specializationArgCount,
568        ObjectID outSpecializedComponentTypeId,
569        ObjectID outDiagnosticsId) override;
570    virtual void ITypeConformance_link(
571        ObjectID objectId,
572        ObjectID outLinkedComponentTypeId,
573        ObjectID outDiagnosticsId) override;
574    virtual void ITypeConformance_getEntryPointHostCallable(
575        ObjectID objectId,
576        int entryPointIndex,
577        int targetIndex,
578        ObjectID outSharedLibrary,
579        ObjectID outDiagnostics) override;
580    virtual void ITypeConformance_renameEntryPoint(
581        ObjectID objectId,
582        const char* newName,
583        ObjectID outEntryPointId) override;
584    virtual void ITypeConformance_linkWithOptions(
585        ObjectID objectId,
586        ObjectID outLinkedComponentTypeId,
587        uint32_t compilerOptionEntryCount,
588        slang::CompilerOptionEntry* compilerOptionEntries,
589        ObjectID outDiagnosticsId) override;
590
591    // IComponentType2 methods.
592    virtual void IComponentType2_getTargetCompileResult(
593        ObjectID objectId,
594        SlangInt targetIndex,
595        ObjectID outCompileResultId,
596        ObjectID outDiagnosticsId) override;
597    virtual void IComponentType2_getEntryPointCompileResult(
598        ObjectID objectId,
599        SlangInt entryPointIndex,
600        SlangInt targetIndex,
601        ObjectID outCompileResultId,
602        ObjectID outDiagnosticsId) override;
603
604    static void printDiagnosticMessage(slang::IBlob* diagnosticsBlob);
605
606private:
607    // Map of the address of the object allocated by slang during record to
608    // the address of the object allocated by the replay.
609    // We need to have this map because we never save the content of the object
610    // allocated by slang. Because those are just opaque objects or handles, we
611    // only need to provide them to the corresponding replay function or call the
612    // methods on the correct object.
613    Slang::Dictionary<ObjectID, void*> m_objectMap;
614
615    template<typename T>
616    inline T* getObjectPointer(ObjectID objectId)
617    {
618        void* objPtr = nullptr;
619        if (!m_objectMap.tryGetValue(objectId, objPtr))
620        {
621            slangRecordLog(LogLevel::Error, "Object not found in the object map: %d\n", objectId);
622            std::abort();
623        }
624
625        return static_cast<T*>(objPtr);
626    }
627
628    CommonInterfaceReplayer m_commonReplayer{m_objectMap};
629};
630} // namespace SlangRecord
631#endif // REPLAY_CONSUMER_H