1*35238bceSAndroid Build Coastguard Worker #ifndef _PCREADER_HPP 2*35238bceSAndroid Build Coastguard Worker #define _PCREADER_HPP 3*35238bceSAndroid Build Coastguard Worker 4*35238bceSAndroid Build Coastguard Worker /* Copyright (c) 2021, NVIDIA CORPORATION 5*35238bceSAndroid Build Coastguard Worker * 6*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 7*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 8*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 9*35238bceSAndroid Build Coastguard Worker * 10*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 11*35238bceSAndroid Build Coastguard Worker * 12*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 13*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 14*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 16*35238bceSAndroid Build Coastguard Worker * limitations under the License. 17*35238bceSAndroid Build Coastguard Worker * 18*35238bceSAndroid Build Coastguard Worker * Author: Daniel Koch <[email protected]> 19*35238bceSAndroid Build Coastguard Worker */ 20*35238bceSAndroid Build Coastguard Worker 21*35238bceSAndroid Build Coastguard Worker #include <cstddef> 22*35238bceSAndroid Build Coastguard Worker 23*35238bceSAndroid Build Coastguard Worker #ifndef VKSC_ASSERT 24*35238bceSAndroid Build Coastguard Worker #include <cassert> 25*35238bceSAndroid Build Coastguard Worker #define VKSC_ASSERT assert 26*35238bceSAndroid Build Coastguard Worker #endif // VKSC_ASSERT 27*35238bceSAndroid Build Coastguard Worker #ifndef VKSC_MEMCMP 28*35238bceSAndroid Build Coastguard Worker #include <cstring> 29*35238bceSAndroid Build Coastguard Worker #define VKSC_MEMCMP memcmp 30*35238bceSAndroid Build Coastguard Worker #endif // VKSC_MEMCPY 31*35238bceSAndroid Build Coastguard Worker 32*35238bceSAndroid Build Coastguard Worker // Must be version 1.0.6 or newer 33*35238bceSAndroid Build Coastguard Worker //#include <vulkan/vulkan_sc_core.hpp> 34*35238bceSAndroid Build Coastguard Worker 35*35238bceSAndroid Build Coastguard Worker // Legacy Header for version 1.0.4 36*35238bceSAndroid Build Coastguard Worker #define VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE_LEGACY (VkPipelineCacheHeaderVersion)1000298000 37*35238bceSAndroid Build Coastguard Worker typedef struct VkPipelineCacheHeaderVersionSafetyCriticalOneLegacy 38*35238bceSAndroid Build Coastguard Worker { 39*35238bceSAndroid Build Coastguard Worker VkPipelineCacheHeaderVersionOne headerVersionOne; 40*35238bceSAndroid Build Coastguard Worker VkPipelineCacheValidationVersion validationVersion; 41*35238bceSAndroid Build Coastguard Worker uint32_t pipelineIndexCount; 42*35238bceSAndroid Build Coastguard Worker uint32_t pipelineIndexStride; 43*35238bceSAndroid Build Coastguard Worker uint64_t pipelineIndexOffset; 44*35238bceSAndroid Build Coastguard Worker } VkPipelineCacheHeaderVersionSafetyCriticalOneLegacy; 45*35238bceSAndroid Build Coastguard Worker 46*35238bceSAndroid Build Coastguard Worker // VKSCPipelineCacheHeaderReader 47*35238bceSAndroid Build Coastguard Worker // 48*35238bceSAndroid Build Coastguard Worker // Utility class to handle extracting information about pipelines from a pipeline cache blob. 49*35238bceSAndroid Build Coastguard Worker // 50*35238bceSAndroid Build Coastguard Worker // Instantiate the class with a pointer to the pipeline cache blob and the size. 51*35238bceSAndroid Build Coastguard Worker // The pipeline cache blob is NOT copied and the application must maintain the lifetime 52*35238bceSAndroid Build Coastguard Worker // of the data that was passed in while this object is instantiated. 53*35238bceSAndroid Build Coastguard Worker // The cache blob will never be modified by this class. 54*35238bceSAndroid Build Coastguard Worker // 55*35238bceSAndroid Build Coastguard Worker // getSafetyCriticalOneHeader - return the safety critical header field 56*35238bceSAndroid Build Coastguard Worker // 57*35238bceSAndroid Build Coastguard Worker // getPipelineIndexEntry(index) - return the pipeline index entry for a specified index in the header 58*35238bceSAndroid Build Coastguard Worker // 59*35238bceSAndroid Build Coastguard Worker // getPipelineIndexEntry(UUID) - return the pipeline index entry for a specified pipeline identifier 60*35238bceSAndroid Build Coastguard Worker // 61*35238bceSAndroid Build Coastguard Worker // getJson - get a pointer to the json for a specfied pipeline index entry 62*35238bceSAndroid Build Coastguard Worker // 63*35238bceSAndroid Build Coastguard Worker // getStageIndexEntry - return the stage index entry for a specified pipeline index entry and stage 64*35238bceSAndroid Build Coastguard Worker // 65*35238bceSAndroid Build Coastguard Worker // getSPIRV - get a pointer to the SPIRV code for a specified stage index entry 66*35238bceSAndroid Build Coastguard Worker // 67*35238bceSAndroid Build Coastguard Worker 68*35238bceSAndroid Build Coastguard Worker class VKSCPipelineCacheHeaderReader 69*35238bceSAndroid Build Coastguard Worker { 70*35238bceSAndroid Build Coastguard Worker public: 71*35238bceSAndroid Build Coastguard Worker // initialize the pipeline cache header reader with <cacheSize> bytes of data starting at <cacheData> 72*35238bceSAndroid Build Coastguard Worker // the pipeline cache is not copied, but the pointer is saved 73*35238bceSAndroid Build Coastguard Worker // cacheData is never modified VKSCPipelineCacheHeaderReader(uint64_t cacheSize,const uint8_t * cacheData)74*35238bceSAndroid Build Coastguard Worker VKSCPipelineCacheHeaderReader(uint64_t cacheSize, const uint8_t *cacheData) 75*35238bceSAndroid Build Coastguard Worker : m_CacheSize{cacheSize} 76*35238bceSAndroid Build Coastguard Worker , m_CacheData{cacheData} 77*35238bceSAndroid Build Coastguard Worker { 78*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOne *const sc1 = 79*35238bceSAndroid Build Coastguard Worker reinterpret_cast<const VkPipelineCacheHeaderVersionSafetyCriticalOne *>(m_CacheData); 80*35238bceSAndroid Build Coastguard Worker 81*35238bceSAndroid Build Coastguard Worker m_IsLegacy = 82*35238bceSAndroid Build Coastguard Worker (sc1->headerVersionOne.headerVersion == VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE_LEGACY); 83*35238bceSAndroid Build Coastguard Worker } 84*35238bceSAndroid Build Coastguard Worker 85*35238bceSAndroid Build Coastguard Worker // basic quick check of the referenced pipeline cache data 86*35238bceSAndroid Build Coastguard Worker // make sure m_CacheData starts with a well-formed VkPipelineCacheHeaderVersionSafetyCriticalOne structure isValid() const87*35238bceSAndroid Build Coastguard Worker bool isValid() const 88*35238bceSAndroid Build Coastguard Worker { 89*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOne *const sc1 = 90*35238bceSAndroid Build Coastguard Worker reinterpret_cast<const VkPipelineCacheHeaderVersionSafetyCriticalOne *>(m_CacheData); 91*35238bceSAndroid Build Coastguard Worker 92*35238bceSAndroid Build Coastguard Worker if (sc1->headerVersionOne.headerSize != sizeof(VkPipelineCacheHeaderVersionSafetyCriticalOne) || 93*35238bceSAndroid Build Coastguard Worker !(sc1->headerVersionOne.headerVersion == VK_PIPELINE_CACHE_HEADER_VERSION_SAFETY_CRITICAL_ONE || 94*35238bceSAndroid Build Coastguard Worker isLegacy()) || 95*35238bceSAndroid Build Coastguard Worker sc1->validationVersion != VK_PIPELINE_CACHE_VALIDATION_VERSION_SAFETY_CRITICAL_ONE) 96*35238bceSAndroid Build Coastguard Worker { 97*35238bceSAndroid Build Coastguard Worker return false; 98*35238bceSAndroid Build Coastguard Worker } 99*35238bceSAndroid Build Coastguard Worker return true; 100*35238bceSAndroid Build Coastguard Worker } 101*35238bceSAndroid Build Coastguard Worker isLegacy() const102*35238bceSAndroid Build Coastguard Worker bool isLegacy() const 103*35238bceSAndroid Build Coastguard Worker { 104*35238bceSAndroid Build Coastguard Worker return m_IsLegacy; 105*35238bceSAndroid Build Coastguard Worker } 106*35238bceSAndroid Build Coastguard Worker 107*35238bceSAndroid Build Coastguard Worker // return pointer to the VkPipelineCacheHeaderVersionOne structure getHeaderVersionOne() const108*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionOne *getHeaderVersionOne() const 109*35238bceSAndroid Build Coastguard Worker { 110*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionOne *const hv1 = 111*35238bceSAndroid Build Coastguard Worker reinterpret_cast<const VkPipelineCacheHeaderVersionOne *>(m_CacheData); 112*35238bceSAndroid Build Coastguard Worker 113*35238bceSAndroid Build Coastguard Worker return hv1; 114*35238bceSAndroid Build Coastguard Worker } 115*35238bceSAndroid Build Coastguard Worker 116*35238bceSAndroid Build Coastguard Worker // return the validation version from the SC1 header getValidationVersion() const117*35238bceSAndroid Build Coastguard Worker VkPipelineCacheValidationVersion getValidationVersion() const 118*35238bceSAndroid Build Coastguard Worker { 119*35238bceSAndroid Build Coastguard Worker if (isLegacy()) 120*35238bceSAndroid Build Coastguard Worker { 121*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOneLegacy *const sc1 = getSafetyCriticalOneHeaderLegacy(); 122*35238bceSAndroid Build Coastguard Worker return sc1->validationVersion; 123*35238bceSAndroid Build Coastguard Worker } 124*35238bceSAndroid Build Coastguard Worker else 125*35238bceSAndroid Build Coastguard Worker { 126*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOne *const sc1 = getSafetyCriticalOneHeader(); 127*35238bceSAndroid Build Coastguard Worker return sc1->validationVersion; 128*35238bceSAndroid Build Coastguard Worker } 129*35238bceSAndroid Build Coastguard Worker } 130*35238bceSAndroid Build Coastguard Worker 131*35238bceSAndroid Build Coastguard Worker // return the implementation data field from the SC1 header getImplementationData() const132*35238bceSAndroid Build Coastguard Worker uint32_t getImplementationData() const 133*35238bceSAndroid Build Coastguard Worker { 134*35238bceSAndroid Build Coastguard Worker if (isLegacy()) 135*35238bceSAndroid Build Coastguard Worker { 136*35238bceSAndroid Build Coastguard Worker return 0U; 137*35238bceSAndroid Build Coastguard Worker } 138*35238bceSAndroid Build Coastguard Worker else 139*35238bceSAndroid Build Coastguard Worker { 140*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOne *const sc1 = getSafetyCriticalOneHeader(); 141*35238bceSAndroid Build Coastguard Worker return sc1->implementationData; 142*35238bceSAndroid Build Coastguard Worker } 143*35238bceSAndroid Build Coastguard Worker } 144*35238bceSAndroid Build Coastguard Worker 145*35238bceSAndroid Build Coastguard Worker // return the number of pipelines in the index getPipelineIndexCount() const146*35238bceSAndroid Build Coastguard Worker uint32_t getPipelineIndexCount() const 147*35238bceSAndroid Build Coastguard Worker { 148*35238bceSAndroid Build Coastguard Worker if (isLegacy()) 149*35238bceSAndroid Build Coastguard Worker { 150*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOneLegacy *const sc1 = getSafetyCriticalOneHeaderLegacy(); 151*35238bceSAndroid Build Coastguard Worker return sc1->pipelineIndexCount; 152*35238bceSAndroid Build Coastguard Worker } 153*35238bceSAndroid Build Coastguard Worker else 154*35238bceSAndroid Build Coastguard Worker { 155*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOne *const sc1 = getSafetyCriticalOneHeader(); 156*35238bceSAndroid Build Coastguard Worker return sc1->pipelineIndexCount; 157*35238bceSAndroid Build Coastguard Worker } 158*35238bceSAndroid Build Coastguard Worker } 159*35238bceSAndroid Build Coastguard Worker 160*35238bceSAndroid Build Coastguard Worker // return the stride between pipeline index entries in the index getPipelineIndexStride() const161*35238bceSAndroid Build Coastguard Worker uint32_t getPipelineIndexStride() const 162*35238bceSAndroid Build Coastguard Worker { 163*35238bceSAndroid Build Coastguard Worker if (isLegacy()) 164*35238bceSAndroid Build Coastguard Worker { 165*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOneLegacy *const sc1 = getSafetyCriticalOneHeaderLegacy(); 166*35238bceSAndroid Build Coastguard Worker return sc1->pipelineIndexStride; 167*35238bceSAndroid Build Coastguard Worker } 168*35238bceSAndroid Build Coastguard Worker else 169*35238bceSAndroid Build Coastguard Worker { 170*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOne *const sc1 = getSafetyCriticalOneHeader(); 171*35238bceSAndroid Build Coastguard Worker return sc1->pipelineIndexStride; 172*35238bceSAndroid Build Coastguard Worker } 173*35238bceSAndroid Build Coastguard Worker } 174*35238bceSAndroid Build Coastguard Worker 175*35238bceSAndroid Build Coastguard Worker // returns the offset to the start of pipeline index entries in the cache getPipelineIndexOffset() const176*35238bceSAndroid Build Coastguard Worker uint64_t getPipelineIndexOffset() const 177*35238bceSAndroid Build Coastguard Worker { 178*35238bceSAndroid Build Coastguard Worker if (isLegacy()) 179*35238bceSAndroid Build Coastguard Worker { 180*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOneLegacy *const sc1 = getSafetyCriticalOneHeaderLegacy(); 181*35238bceSAndroid Build Coastguard Worker return sc1->pipelineIndexOffset; 182*35238bceSAndroid Build Coastguard Worker } 183*35238bceSAndroid Build Coastguard Worker else 184*35238bceSAndroid Build Coastguard Worker { 185*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOne *const sc1 = getSafetyCriticalOneHeader(); 186*35238bceSAndroid Build Coastguard Worker return sc1->pipelineIndexOffset; 187*35238bceSAndroid Build Coastguard Worker } 188*35238bceSAndroid Build Coastguard Worker } 189*35238bceSAndroid Build Coastguard Worker 190*35238bceSAndroid Build Coastguard Worker // return pointer to pipeline index entry by <index> in pipeline header 191*35238bceSAndroid Build Coastguard Worker // typically used for iterating over all pipelines in the cache 192*35238bceSAndroid Build Coastguard Worker // nullptr is returned if <index> is out of range getPipelineIndexEntry(uint32_t index) const193*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheSafetyCriticalIndexEntry *getPipelineIndexEntry(uint32_t index) const 194*35238bceSAndroid Build Coastguard Worker { 195*35238bceSAndroid Build Coastguard Worker if (index >= getPipelineIndexCount()) 196*35238bceSAndroid Build Coastguard Worker { 197*35238bceSAndroid Build Coastguard Worker return nullptr; 198*35238bceSAndroid Build Coastguard Worker } 199*35238bceSAndroid Build Coastguard Worker 200*35238bceSAndroid Build Coastguard Worker uint64_t offset = getPipelineIndexOffset() + (index * getPipelineIndexStride()); 201*35238bceSAndroid Build Coastguard Worker VKSC_ASSERT(offset + sizeof(VkPipelineCacheSafetyCriticalIndexEntry) <= m_CacheSize); 202*35238bceSAndroid Build Coastguard Worker 203*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheSafetyCriticalIndexEntry *const pipelineIndexEntry = 204*35238bceSAndroid Build Coastguard Worker reinterpret_cast<const VkPipelineCacheSafetyCriticalIndexEntry *>(m_CacheData + offset); 205*35238bceSAndroid Build Coastguard Worker 206*35238bceSAndroid Build Coastguard Worker return pipelineIndexEntry; 207*35238bceSAndroid Build Coastguard Worker } 208*35238bceSAndroid Build Coastguard Worker 209*35238bceSAndroid Build Coastguard Worker // return pointer to pipeline index entry for requested pipeline identifier 210*35238bceSAndroid Build Coastguard Worker // nullptr is returned if not found getPipelineIndexEntry(const uint8_t identifier[VK_UUID_SIZE]) const211*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheSafetyCriticalIndexEntry *getPipelineIndexEntry(const uint8_t identifier[VK_UUID_SIZE]) const 212*35238bceSAndroid Build Coastguard Worker { 213*35238bceSAndroid Build Coastguard Worker const uint32_t pipelineIndexCount = getPipelineIndexCount(); 214*35238bceSAndroid Build Coastguard Worker const uint32_t pipelineIndexStride = getPipelineIndexStride(); 215*35238bceSAndroid Build Coastguard Worker const uint64_t pipelineIndexOffset = getPipelineIndexOffset(); 216*35238bceSAndroid Build Coastguard Worker 217*35238bceSAndroid Build Coastguard Worker for (uint32_t i = 0U; i < pipelineIndexCount; ++i) 218*35238bceSAndroid Build Coastguard Worker { 219*35238bceSAndroid Build Coastguard Worker uint64_t offset = pipelineIndexOffset + (i * pipelineIndexStride); 220*35238bceSAndroid Build Coastguard Worker VKSC_ASSERT(offset + sizeof(VkPipelineCacheSafetyCriticalIndexEntry) <= m_CacheSize); 221*35238bceSAndroid Build Coastguard Worker 222*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheSafetyCriticalIndexEntry *const pipelineIndexEntry = 223*35238bceSAndroid Build Coastguard Worker reinterpret_cast<const VkPipelineCacheSafetyCriticalIndexEntry *>(m_CacheData + offset); 224*35238bceSAndroid Build Coastguard Worker 225*35238bceSAndroid Build Coastguard Worker if (VKSC_MEMCMP(identifier, pipelineIndexEntry->pipelineIdentifier, VK_UUID_SIZE) == 0U) 226*35238bceSAndroid Build Coastguard Worker { 227*35238bceSAndroid Build Coastguard Worker return pipelineIndexEntry; 228*35238bceSAndroid Build Coastguard Worker } 229*35238bceSAndroid Build Coastguard Worker } 230*35238bceSAndroid Build Coastguard Worker 231*35238bceSAndroid Build Coastguard Worker return nullptr; 232*35238bceSAndroid Build Coastguard Worker } 233*35238bceSAndroid Build Coastguard Worker 234*35238bceSAndroid Build Coastguard Worker // return pointer to json for a given pipeline index entry 235*35238bceSAndroid Build Coastguard Worker // nullptr is returned if not present getJson(const VkPipelineCacheSafetyCriticalIndexEntry * const pipelineIndexEntry) const236*35238bceSAndroid Build Coastguard Worker const uint8_t *getJson(const VkPipelineCacheSafetyCriticalIndexEntry *const pipelineIndexEntry) const 237*35238bceSAndroid Build Coastguard Worker { 238*35238bceSAndroid Build Coastguard Worker uint64_t offset = pipelineIndexEntry->jsonOffset; 239*35238bceSAndroid Build Coastguard Worker if (0U == offset) 240*35238bceSAndroid Build Coastguard Worker return nullptr; 241*35238bceSAndroid Build Coastguard Worker 242*35238bceSAndroid Build Coastguard Worker VKSC_ASSERT(offset + pipelineIndexEntry->jsonSize <= m_CacheSize); 243*35238bceSAndroid Build Coastguard Worker 244*35238bceSAndroid Build Coastguard Worker return (m_CacheData + offset); 245*35238bceSAndroid Build Coastguard Worker } 246*35238bceSAndroid Build Coastguard Worker 247*35238bceSAndroid Build Coastguard Worker // return pointer to stage validation index entry given a pipeline index entry <pipelineIndexEntry> and <stage> 248*35238bceSAndroid Build Coastguard Worker // nullptr is returned if not present getStageIndexEntry(const VkPipelineCacheSafetyCriticalIndexEntry * const pipelineIndexEntry,uint32_t stage) const249*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheStageValidationIndexEntry *getStageIndexEntry( 250*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheSafetyCriticalIndexEntry *const pipelineIndexEntry, uint32_t stage) const 251*35238bceSAndroid Build Coastguard Worker { 252*35238bceSAndroid Build Coastguard Worker if (stage >= pipelineIndexEntry->stageIndexCount) 253*35238bceSAndroid Build Coastguard Worker return nullptr; 254*35238bceSAndroid Build Coastguard Worker 255*35238bceSAndroid Build Coastguard Worker uint64_t offset = pipelineIndexEntry->stageIndexOffset + (stage * pipelineIndexEntry->stageIndexStride); 256*35238bceSAndroid Build Coastguard Worker VKSC_ASSERT(offset + sizeof(VkPipelineCacheStageValidationIndexEntry) <= m_CacheSize); 257*35238bceSAndroid Build Coastguard Worker 258*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheStageValidationIndexEntry *const stageIndexEntry = 259*35238bceSAndroid Build Coastguard Worker reinterpret_cast<const VkPipelineCacheStageValidationIndexEntry *>(m_CacheData + offset); 260*35238bceSAndroid Build Coastguard Worker 261*35238bceSAndroid Build Coastguard Worker return stageIndexEntry; 262*35238bceSAndroid Build Coastguard Worker } 263*35238bceSAndroid Build Coastguard Worker 264*35238bceSAndroid Build Coastguard Worker // return pointer to spirv code in the pipeline cache for a given stage index entry 265*35238bceSAndroid Build Coastguard Worker // nullptr is returned if not present getSPIRV(const VkPipelineCacheStageValidationIndexEntry * const stageIndexEntry) const266*35238bceSAndroid Build Coastguard Worker const uint8_t *getSPIRV(const VkPipelineCacheStageValidationIndexEntry *const stageIndexEntry) const 267*35238bceSAndroid Build Coastguard Worker { 268*35238bceSAndroid Build Coastguard Worker uint64_t offset = stageIndexEntry->codeOffset; 269*35238bceSAndroid Build Coastguard Worker if (0U == offset) 270*35238bceSAndroid Build Coastguard Worker return nullptr; 271*35238bceSAndroid Build Coastguard Worker 272*35238bceSAndroid Build Coastguard Worker VKSC_ASSERT(offset + stageIndexEntry->codeSize <= m_CacheSize); 273*35238bceSAndroid Build Coastguard Worker 274*35238bceSAndroid Build Coastguard Worker return (m_CacheData + offset); 275*35238bceSAndroid Build Coastguard Worker } 276*35238bceSAndroid Build Coastguard Worker 277*35238bceSAndroid Build Coastguard Worker private: 278*35238bceSAndroid Build Coastguard Worker // return pointer to the pipeline cache SafetyCriticalOne structure getSafetyCriticalOneHeader() const279*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOne *getSafetyCriticalOneHeader() const 280*35238bceSAndroid Build Coastguard Worker { 281*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOne *const sc1 = 282*35238bceSAndroid Build Coastguard Worker reinterpret_cast<const VkPipelineCacheHeaderVersionSafetyCriticalOne *>(m_CacheData); 283*35238bceSAndroid Build Coastguard Worker 284*35238bceSAndroid Build Coastguard Worker return sc1; 285*35238bceSAndroid Build Coastguard Worker } 286*35238bceSAndroid Build Coastguard Worker 287*35238bceSAndroid Build Coastguard Worker // return pointer to the pipeline cache SafetyCriticalOneLegacy structure getSafetyCriticalOneHeaderLegacy() const288*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOneLegacy *getSafetyCriticalOneHeaderLegacy() const 289*35238bceSAndroid Build Coastguard Worker { 290*35238bceSAndroid Build Coastguard Worker const VkPipelineCacheHeaderVersionSafetyCriticalOneLegacy *const sc1 = 291*35238bceSAndroid Build Coastguard Worker reinterpret_cast<const VkPipelineCacheHeaderVersionSafetyCriticalOneLegacy *>(m_CacheData); 292*35238bceSAndroid Build Coastguard Worker 293*35238bceSAndroid Build Coastguard Worker return sc1; 294*35238bceSAndroid Build Coastguard Worker } 295*35238bceSAndroid Build Coastguard Worker const uint64_t m_CacheSize; // size of data pointed to by m_CacheData in bytes 296*35238bceSAndroid Build Coastguard Worker const uint8_t *const m_CacheData; // pipeline cache data being read by this reader 297*35238bceSAndroid Build Coastguard Worker bool m_IsLegacy; // is legacy (pre 1.0.5) pipeline cache format 298*35238bceSAndroid Build Coastguard Worker }; 299*35238bceSAndroid Build Coastguard Worker 300*35238bceSAndroid Build Coastguard Worker #endif // _PCREADER_HPP 301