xref: /aosp_15_r20/external/deqp/external/vulkancts/vkscserver/pcreader.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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