yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
00746bf09
master
1#include "slang-session.h" 2 3#include "../util/record-utility.h" 4#include "slang-component-type.h" 5#include "slang-composite-component-type.h" 6#include "slang-entrypoint.h" 7#include "slang-type-conformance.h" 8 9namespace SlangRecord 10{ 11 12SessionRecorder ::SessionRecorder (slang::ISession * session ,RecordManager * recordManager ) 13 :m_actualSession (session ),m_recordManager (recordManager ) 14{ 15SLANG_RECORD_ASSERT (m_actualSession ); 16SLANG_RECORD_ASSERT (m_recordManager ); 17m_sessionHandle = reinterpret_cast < uint64_t > (m_actualSession .get ()); 18slangRecordLog (LogLevel ::Verbose ,"%s: %p\n" ,"SessionRecorder create:" ,session ); 19} 20 21ISlangUnknown * SessionRecorder ::getInterface (const Guid & guid ) 22{ 23if (guid == ISlangUnknown ::getTypeGuid ()|| guid == ISession ::getTypeGuid ()) 24return asExternal (this ); 25 26return nullptr ; 27} 28 29SLANG_NO_THROW slang::IGlobalSession * SessionRecorder ::getGlobalSession () 30{ 31// No need to record this function. 32slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 33 slang::IGlobalSession * pGlobalSession = m_actualSession -> getGlobalSession (); 34return pGlobalSession ; 35} 36 37SLANG_NO_THROW slang::IModule * SessionRecorder ::loadModule ( 38const char * moduleName , 39 slang::IBlob ** outDiagnostics ) 40{ 41slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 42 43ParameterRecorder * recorder {}; 44 { 45recorder = 46m_recordManager -> beginMethodRecord (ApiCallId ::ISession_loadModule ,m_sessionHandle ); 47recorder -> recordString (moduleName ); 48recorder = m_recordManager -> endMethodRecord (); 49 } 50 51 slang::IModule * pModule = m_actualSession -> loadModule (moduleName ,outDiagnostics ); 52 53 { 54recorder -> recordAddress (outDiagnostics ?* outDiagnostics :nullptr ); 55recorder -> recordAddress (pModule ); 56m_recordManager -> apendOutput (); 57 } 58 59IModuleRecorder * pModuleRecorder = getModuleRecorder (pModule ); 60return static_cast < slang::IModule *> (pModuleRecorder ); 61} 62 63SLANG_NO_THROW slang::IModule * SessionRecorder ::loadModuleFromIRBlob ( 64const char * moduleName , 65const char * path , 66 slang::IBlob * source , 67 slang::IBlob ** outDiagnostics ) 68{ 69slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 70 71ParameterRecorder * recorder {}; 72 { 73recorder = m_recordManager -> beginMethodRecord ( 74ApiCallId ::ISession_loadModuleFromIRBlob , 75m_sessionHandle ); 76recorder -> recordString (moduleName ); 77recorder -> recordString (path ); 78recorder -> recordPointer (source ); 79recorder = m_recordManager -> endMethodRecord (); 80 } 81 82 slang::IModule * pModule = 83m_actualSession -> loadModuleFromIRBlob (moduleName ,path ,source ,outDiagnostics ); 84 85 { 86recorder -> recordAddress (outDiagnostics ?* outDiagnostics :nullptr ); 87recorder -> recordAddress (pModule ); 88m_recordManager -> apendOutput (); 89 } 90 91IModuleRecorder * pModuleRecorder = getModuleRecorder (pModule ); 92return static_cast < slang::IModule *> (pModuleRecorder ); 93} 94 95SLANG_NO_THROW SlangResult SLANG_MCALL SessionRecorder ::loadModuleInfoFromIRBlob ( 96 slang::IBlob * source , 97SlangInt & outModuleVersion , 98const char *& outModuleCompilerVersion , 99const char *& outModuleName ) 100{ 101slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 102 103ParameterRecorder * recorder {}; 104 { 105recorder = m_recordManager -> beginMethodRecord ( 106ApiCallId ::ISession_loadModuleFromIRBlob , 107m_sessionHandle ); 108recorder -> recordPointer (source ); 109recorder = m_recordManager -> endMethodRecord (); 110 } 111 112const auto result = m_actualSession -> loadModuleInfoFromIRBlob ( 113source , 114outModuleVersion , 115outModuleCompilerVersion , 116outModuleName ); 117 118 { 119recorder -> recordInt64 (outModuleVersion ); 120recorder -> recordString (outModuleCompilerVersion ); 121recorder -> recordString (outModuleName ); 122m_recordManager -> apendOutput (); 123 } 124 125return result ; 126} 127 128SLANG_NO_THROW slang::IModule * SessionRecorder ::loadModuleFromSource ( 129const char * moduleName , 130const char * path , 131 slang::IBlob * source , 132 slang::IBlob ** outDiagnostics ) 133{ 134slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 135 136ParameterRecorder * recorder {}; 137 { 138recorder = m_recordManager -> beginMethodRecord ( 139ApiCallId ::ISession_loadModuleFromSource , 140m_sessionHandle ); 141recorder -> recordString (moduleName ); 142recorder -> recordString (path ); 143recorder -> recordPointer (source ); 144recorder = m_recordManager -> endMethodRecord (); 145 } 146 147 slang::IModule * pModule = 148m_actualSession -> loadModuleFromSource (moduleName ,path ,source ,outDiagnostics ); 149 150 { 151recorder -> recordAddress (outDiagnostics ?* outDiagnostics :nullptr ); 152recorder -> recordAddress (pModule ); 153m_recordManager -> apendOutput (); 154 } 155 156IModuleRecorder * pModuleRecorder = getModuleRecorder (pModule ); 157return static_cast < slang::IModule *> (pModuleRecorder ); 158} 159 160SLANG_NO_THROW slang::IModule * SessionRecorder ::loadModuleFromSourceString ( 161const char * moduleName , 162const char * path , 163const char * string , 164 slang::IBlob ** outDiagnostics ) 165{ 166slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 167 168ParameterRecorder * recorder {}; 169 { 170recorder = m_recordManager -> beginMethodRecord ( 171ApiCallId ::ISession_loadModuleFromSourceString , 172m_sessionHandle ); 173recorder -> recordString (moduleName ); 174recorder -> recordString (path ); 175recorder -> recordString (string ); 176recorder = m_recordManager -> endMethodRecord (); 177 } 178 179 slang::IModule * pModule = 180m_actualSession -> loadModuleFromSourceString (moduleName ,path ,string ,outDiagnostics ); 181 182 { 183// TODO: Not sure if we need to record the diagnostics blob. 184recorder -> recordAddress (outDiagnostics ?* outDiagnostics :nullptr ); 185recorder -> recordAddress (pModule ); 186m_recordManager -> apendOutput (); 187 } 188 189IModuleRecorder * pModuleRecorder = getModuleRecorder (pModule ); 190return static_cast < slang::IModule *> (pModuleRecorder ); 191} 192 193SLANG_NO_THROW SlangResult SessionRecorder ::createCompositeComponentType ( 194 slang::IComponentType * const * componentTypes , 195SlangInt componentTypeCount , 196 slang::IComponentType ** outCompositeComponentType , 197ISlangBlob ** outDiagnostics ) 198{ 199slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 200 201Slang ::List < slang::IComponentType *> componentTypeList ; 202 203// get the actual component types from our record wrappers 204if (SLANG_OK != getActualComponentTypes (componentTypes ,componentTypeCount ,componentTypeList )) 205 { 206SLANG_RECORD_ASSERT (!"Failed to get actual component types" ); 207 } 208 209ParameterRecorder * recorder {}; 210 { 211recorder = m_recordManager -> beginMethodRecord ( 212ApiCallId ::ISession_createCompositeComponentType , 213m_sessionHandle ); 214recorder -> recordAddressArray (componentTypeList .getBuffer (),componentTypeCount ); 215recorder = m_recordManager -> endMethodRecord (); 216 } 217 218SlangResult result = m_actualSession -> createCompositeComponentType ( 219componentTypeList .getBuffer (), 220componentTypeCount , 221outCompositeComponentType , 222outDiagnostics ); 223 224 { 225recorder -> recordAddress (* outCompositeComponentType ); 226recorder -> recordAddress (outDiagnostics ?* outDiagnostics :nullptr ); 227m_recordManager -> apendOutput (); 228 } 229 230if (SLANG_OK == result ) 231 { 232CompositeComponentTypeRecorder * compositeComponentTypeRecord = 233new CompositeComponentTypeRecorder (this ,* outCompositeComponentType ,m_recordManager ); 234Slang ::ComPtr < CompositeComponentTypeRecorder > resultRecord (compositeComponentTypeRecord ); 235* outCompositeComponentType = resultRecord .detach (); 236 } 237 238return result ; 239} 240 241SLANG_NO_THROW slang::TypeReflection * SessionRecorder ::specializeType ( 242 slang::TypeReflection * type , 243 slang::SpecializationArg const * specializationArgs , 244SlangInt specializationArgCount , 245ISlangBlob ** outDiagnostics ) 246{ 247slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 248 249ParameterRecorder * recorder {}; 250 { 251recorder = 252m_recordManager -> beginMethodRecord (ApiCallId ::ISession_specializeType ,m_sessionHandle ); 253recorder -> recordAddress (type ); 254recorder -> recordStructArray (specializationArgs ,specializationArgCount ); 255recorder = m_recordManager -> endMethodRecord (); 256 } 257 258 slang::TypeReflection * pTypeReflection = m_actualSession -> specializeType ( 259type , 260specializationArgs , 261specializationArgCount , 262outDiagnostics ); 263 264 { 265recorder -> recordAddress (outDiagnostics ?* outDiagnostics :nullptr ); 266recorder -> recordAddress (pTypeReflection ); 267m_recordManager -> apendOutput (); 268 } 269 270return pTypeReflection ; 271} 272 273SLANG_NO_THROW slang::TypeLayoutReflection * SessionRecorder ::getTypeLayout ( 274 slang::TypeReflection * type , 275SlangInt targetIndex , 276 slang::LayoutRules rules , 277ISlangBlob ** outDiagnostics ) 278{ 279slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 280 281ParameterRecorder * recorder {}; 282 { 283recorder = 284m_recordManager -> beginMethodRecord (ApiCallId ::ISession_getTypeLayout ,m_sessionHandle ); 285recorder -> recordAddress (type ); 286recorder -> recordInt64 (targetIndex ); 287recorder -> recordEnumValue (rules ); 288recorder = m_recordManager -> endMethodRecord (); 289 } 290 291 slang::TypeLayoutReflection * pTypeLayoutReflection = 292m_actualSession -> getTypeLayout (type ,targetIndex ,rules ,outDiagnostics ); 293 294 { 295recorder -> recordAddress (outDiagnostics ?* outDiagnostics :nullptr ); 296recorder -> recordAddress (pTypeLayoutReflection ); 297m_recordManager -> apendOutput (); 298 } 299 300return pTypeLayoutReflection ; 301} 302 303SLANG_NO_THROW slang::TypeReflection * SessionRecorder ::getContainerType ( 304 slang::TypeReflection * elementType , 305 slang::ContainerType containerType , 306ISlangBlob ** outDiagnostics ) 307{ 308slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 309 310ParameterRecorder * recorder {}; 311 { 312recorder = m_recordManager -> beginMethodRecord ( 313ApiCallId ::ISession_getContainerType , 314m_sessionHandle ); 315recorder -> recordAddress (elementType ); 316recorder -> recordEnumValue (containerType ); 317recorder = m_recordManager -> endMethodRecord (); 318 } 319 320 slang::TypeReflection * pTypeReflection = 321m_actualSession -> getContainerType (elementType ,containerType ,outDiagnostics ); 322 323 { 324recorder -> recordAddress (outDiagnostics ?* outDiagnostics :nullptr ); 325recorder -> recordAddress (pTypeReflection ); 326m_recordManager -> apendOutput (); 327 } 328 329return pTypeReflection ; 330} 331 332SLANG_NO_THROW slang::TypeReflection * SessionRecorder ::getDynamicType () 333{ 334slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 335 336ParameterRecorder * recorder {}; 337 { 338recorder = 339m_recordManager -> beginMethodRecord (ApiCallId ::ISession_getDynamicType ,m_sessionHandle ); 340recorder = m_recordManager -> endMethodRecord (); 341 } 342 343 slang::TypeReflection * pTypeReflection = m_actualSession -> getDynamicType (); 344 345 { 346recorder -> recordAddress (pTypeReflection ); 347m_recordManager -> apendOutput (); 348 } 349 350return pTypeReflection ; 351} 352 353SLANG_NO_THROW SlangResult 354SessionRecorder ::getTypeRTTIMangledName (slang::TypeReflection * type ,ISlangBlob ** outNameBlob ) 355{ 356slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 357 358ParameterRecorder * recorder {}; 359 { 360recorder = m_recordManager -> beginMethodRecord ( 361ApiCallId ::ISession_getTypeRTTIMangledName , 362m_sessionHandle ); 363recorder -> recordAddress (type ); 364recorder = m_recordManager -> endMethodRecord (); 365 } 366 367SlangResult result = m_actualSession -> getTypeRTTIMangledName (type ,outNameBlob ); 368 369 { 370recorder -> recordAddress (outNameBlob ); 371m_recordManager -> apendOutput (); 372 } 373 374return result ; 375} 376 377SLANG_NO_THROW SlangResult SessionRecorder ::getTypeConformanceWitnessMangledName ( 378 slang::TypeReflection * type , 379 slang::TypeReflection * interfaceType , 380ISlangBlob ** outNameBlob ) 381{ 382slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 383 384ParameterRecorder * recorder {}; 385 { 386recorder = m_recordManager -> beginMethodRecord ( 387ApiCallId ::ISession_getTypeConformanceWitnessMangledName , 388m_sessionHandle ); 389recorder -> recordAddress (type ); 390recorder -> recordAddress (interfaceType ); 391recorder = m_recordManager -> endMethodRecord (); 392 } 393 394SlangResult result = 395m_actualSession -> getTypeConformanceWitnessMangledName (type ,interfaceType ,outNameBlob ); 396 397 { 398recorder -> recordAddress (outNameBlob ); 399m_recordManager -> apendOutput (); 400 } 401 402return result ; 403} 404 405SLANG_NO_THROW SlangResult SessionRecorder ::getDynamicObjectRTTIBytes ( 406 slang::TypeReflection * type , 407 slang::TypeReflection * interfaceType , 408uint32_t * outRTTIDataBuffer , 409uint32_t bufferSizeInBytes ) 410{ 411// No need to record this function, it's just a query. 412 413SlangResult result = m_actualSession -> getDynamicObjectRTTIBytes ( 414type , 415interfaceType , 416outRTTIDataBuffer , 417bufferSizeInBytes ); 418return result ; 419} 420 421SLANG_NO_THROW SlangResult SessionRecorder ::getTypeConformanceWitnessSequentialID ( 422 slang::TypeReflection * type , 423 slang::TypeReflection * interfaceType , 424uint32_t * outId ) 425{ 426slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 427 428ParameterRecorder * recorder {}; 429 { 430recorder = m_recordManager -> beginMethodRecord ( 431ApiCallId ::ISession_getTypeConformanceWitnessSequentialID , 432m_sessionHandle ); 433recorder -> recordAddress (type ); 434recorder -> recordAddress (interfaceType ); 435recorder = m_recordManager -> endMethodRecord (); 436 } 437 438SlangResult result = 439m_actualSession -> getTypeConformanceWitnessSequentialID (type ,interfaceType ,outId ); 440 441// No need to record outId, it's not slang allocation 442return result ; 443} 444 445SLANG_NO_THROW SlangResult SessionRecorder ::createTypeConformanceComponentType ( 446 slang::TypeReflection * type , 447 slang::TypeReflection * interfaceType , 448 slang::ITypeConformance ** outConformance , 449SlangInt conformanceIdOverride , 450ISlangBlob ** outDiagnostics ) 451{ 452slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 453 454ParameterRecorder * recorder {}; 455 { 456recorder = m_recordManager -> beginMethodRecord ( 457ApiCallId ::ISession_createTypeConformanceComponentType , 458m_sessionHandle ); 459recorder -> recordAddress (type ); 460recorder -> recordAddress (interfaceType ); 461recorder -> recordInt64 (conformanceIdOverride ); 462recorder = m_recordManager -> endMethodRecord (); 463 } 464 465SlangResult result = m_actualSession -> createTypeConformanceComponentType ( 466type , 467interfaceType , 468outConformance , 469conformanceIdOverride , 470outDiagnostics ); 471 472 { 473recorder -> recordAddress (* outConformance ); 474recorder -> recordAddress (outDiagnostics ?* outDiagnostics :nullptr ); 475m_recordManager -> apendOutput (); 476 } 477 478if (SLANG_OK != result ) 479 { 480ITypeConformanceRecorder * conformanceRecord = 481new TypeConformanceRecorder (this ,* outConformance ,m_recordManager ); 482Slang ::ComPtr < ITypeConformanceRecorder > resultRecord (conformanceRecord ); 483* outConformance = resultRecord .detach (); 484 } 485 486return result ; 487} 488 489SLANG_NO_THROW SlangResult 490SessionRecorder ::createCompileRequest (SlangCompileRequest ** outCompileRequest ) 491{ 492slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 493 494ParameterRecorder * recorder {}; 495 { 496recorder = m_recordManager -> beginMethodRecord ( 497ApiCallId ::ISession_createCompileRequest , 498m_sessionHandle ); 499recorder = m_recordManager -> endMethodRecord (); 500 } 501 502SlangResult result = m_actualSession -> createCompileRequest (outCompileRequest ); 503 504 { 505recorder -> recordAddress (* outCompileRequest ); 506m_recordManager -> apendOutput (); 507 } 508 509return result ; 510} 511 512SLANG_NO_THROW SlangInt SessionRecorder ::getLoadedModuleCount () 513{ 514// No need to record this function, it's just a query. 515slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 516SlangInt count = m_actualSession -> getLoadedModuleCount (); 517return count ; 518} 519 520SLANG_NO_THROW slang::IModule * SessionRecorder ::getLoadedModule (SlangInt index ) 521{ 522slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 523 524ParameterRecorder * recorder {}; 525 { 526recorder = m_recordManager -> beginMethodRecord ( 527ApiCallId ::ISession_getLoadedModule , 528m_sessionHandle ); 529recorder -> recordInt64 (index ); 530recorder = m_recordManager -> endMethodRecord (); 531 } 532 533 slang::IModule * pModule = m_actualSession -> getLoadedModule (index ); 534 535 { 536recorder -> recordAddress (pModule ); 537m_recordManager -> apendOutput (); 538 } 539 540if (pModule ) 541 { 542IModuleRecorder * moduleRecord = nullptr ; 543bool ret = m_mapModuleToRecord .tryGetValue (pModule ,moduleRecord ); 544if (!ret ) 545 { 546SLANG_RECORD_ASSERT (!"Module not found in mapModuleToRecord" ); 547 } 548ComPtr < slang::IModule > result (static_cast < slang::IModule *> (moduleRecord )); 549return result .detach (); 550 } 551 552return pModule ; 553} 554 555SLANG_NO_THROW bool SessionRecorder ::isBinaryModuleUpToDate ( 556const char * modulePath , 557 slang::IBlob * binaryModuleBlob ) 558{ 559// No need to record this function, it's a query function and doesn't impact slang internal 560// state. 561slangRecordLog (LogLevel ::Verbose ,"%s\n" ,__PRETTY_FUNCTION__ ); 562bool result = m_actualSession -> isBinaryModuleUpToDate (modulePath ,binaryModuleBlob ); 563return result ; 564} 565 566IModuleRecorder * SessionRecorder ::getModuleRecorder (slang::IModule * module ) 567{ 568IModuleRecorder * moduleRecord = nullptr ; 569bool ret = m_mapModuleToRecord .tryGetValue (module ,moduleRecord ); 570if (!ret ) 571 { 572moduleRecord = new ModuleRecorder (this ,module ,m_recordManager ); 573Slang ::ComPtr < IModuleRecorder > result (moduleRecord ); 574m_moduleRecordersAlloation .add (result ); 575m_mapModuleToRecord .add (module ,result .detach ()); 576 } 577else 578 { 579ComPtr < IModuleRecorder > result (moduleRecord ); 580return result .detach (); 581 } 582 583return moduleRecord ; 584} 585 586SlangResult SessionRecorder ::getActualComponentTypes ( 587 slang::IComponentType * const * componentTypes , 588SlangInt componentTypeCount , 589List < slang::IComponentType *>& outActualComponentTypes ) 590{ 591for (SlangInt i = 0 ;i < componentTypeCount ;i ++ ) 592 { 593 slang::IComponentType * const & componentType = componentTypes [i ]; 594void * outObj = nullptr ; 595 596if (componentType -> queryInterface (IModuleRecorder ::getTypeGuid (),& outObj )== SLANG_OK ) 597 { 598ModuleRecorder * moduleRecord = static_cast < ModuleRecorder *> (outObj ); 599outActualComponentTypes .add (moduleRecord -> getActualModule ()); 600 } 601else if ( 602componentType -> queryInterface (IEntryPointRecorder ::getTypeGuid (),& outObj )== SLANG_OK ) 603 { 604EntryPointRecorder * entrypointRecord = static_cast < EntryPointRecorder *> (outObj ); 605outActualComponentTypes .add (entrypointRecord -> getActualEntryPoint ()); 606 } 607else if ( 608componentType -> queryInterface (CompositeComponentTypeRecorder ::getTypeGuid (),& outObj )== 609SLANG_OK ) 610 { 611CompositeComponentTypeRecorder * compositeComponentTypeRecord = 612static_cast < CompositeComponentTypeRecorder *> (outObj ); 613outActualComponentTypes .add ( 614compositeComponentTypeRecord -> getActualCompositeComponentType ()); 615 } 616else if ( 617componentType -> queryInterface (ITypeConformanceRecorder ::getTypeGuid (),& outObj )== 618SLANG_OK ) 619 { 620TypeConformanceRecorder * typeConformanceRecorder = 621static_cast < TypeConformanceRecorder *> (outObj ); 622outActualComponentTypes .add (typeConformanceRecorder -> getActualTypeConformance ()); 623 } 624// will fall back to the actual component type, it means that we didn't record this type. 625else 626 { 627outActualComponentTypes .add (componentType ); 628 } 629 } 630 631if (componentTypeCount == outActualComponentTypes .getCount ()) 632 { 633return SLANG_OK ; 634 } 635return SLANG_FAIL ; 636} 637}// namespace SlangRecord