1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2020 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker #include "VkSpecializationInfo.hpp"
16*03ce13f7SAndroid Build Coastguard Worker
17*03ce13f7SAndroid Build Coastguard Worker #include "System/Memory.hpp"
18*03ce13f7SAndroid Build Coastguard Worker
19*03ce13f7SAndroid Build Coastguard Worker #include <cstring>
20*03ce13f7SAndroid Build Coastguard Worker
21*03ce13f7SAndroid Build Coastguard Worker namespace vk {
22*03ce13f7SAndroid Build Coastguard Worker
SpecializationInfo(const VkSpecializationInfo * specializationInfo)23*03ce13f7SAndroid Build Coastguard Worker SpecializationInfo::SpecializationInfo(const VkSpecializationInfo *specializationInfo)
24*03ce13f7SAndroid Build Coastguard Worker {
25*03ce13f7SAndroid Build Coastguard Worker if(specializationInfo && specializationInfo->mapEntryCount > 0)
26*03ce13f7SAndroid Build Coastguard Worker {
27*03ce13f7SAndroid Build Coastguard Worker info.mapEntryCount = specializationInfo->mapEntryCount;
28*03ce13f7SAndroid Build Coastguard Worker size_t entriesSize = specializationInfo->mapEntryCount * sizeof(VkSpecializationMapEntry);
29*03ce13f7SAndroid Build Coastguard Worker void *mapEntries = sw::allocate(entriesSize);
30*03ce13f7SAndroid Build Coastguard Worker memcpy(mapEntries, specializationInfo->pMapEntries, entriesSize);
31*03ce13f7SAndroid Build Coastguard Worker info.pMapEntries = reinterpret_cast<VkSpecializationMapEntry *>(mapEntries);
32*03ce13f7SAndroid Build Coastguard Worker
33*03ce13f7SAndroid Build Coastguard Worker info.dataSize = specializationInfo->dataSize;
34*03ce13f7SAndroid Build Coastguard Worker void *data = sw::allocate(specializationInfo->dataSize);
35*03ce13f7SAndroid Build Coastguard Worker memcpy(data, specializationInfo->pData, specializationInfo->dataSize);
36*03ce13f7SAndroid Build Coastguard Worker info.pData = data;
37*03ce13f7SAndroid Build Coastguard Worker }
38*03ce13f7SAndroid Build Coastguard Worker }
39*03ce13f7SAndroid Build Coastguard Worker
SpecializationInfo(const SpecializationInfo & copy)40*03ce13f7SAndroid Build Coastguard Worker SpecializationInfo::SpecializationInfo(const SpecializationInfo ©)
41*03ce13f7SAndroid Build Coastguard Worker : SpecializationInfo(©.info)
42*03ce13f7SAndroid Build Coastguard Worker {
43*03ce13f7SAndroid Build Coastguard Worker }
44*03ce13f7SAndroid Build Coastguard Worker
~SpecializationInfo()45*03ce13f7SAndroid Build Coastguard Worker SpecializationInfo::~SpecializationInfo()
46*03ce13f7SAndroid Build Coastguard Worker {
47*03ce13f7SAndroid Build Coastguard Worker sw::freeMemory(const_cast<VkSpecializationMapEntry *>(info.pMapEntries));
48*03ce13f7SAndroid Build Coastguard Worker sw::freeMemory(const_cast<void *>(info.pData));
49*03ce13f7SAndroid Build Coastguard Worker }
50*03ce13f7SAndroid Build Coastguard Worker
operator <(const SpecializationInfo & rhs) const51*03ce13f7SAndroid Build Coastguard Worker bool SpecializationInfo::operator<(const SpecializationInfo &rhs) const
52*03ce13f7SAndroid Build Coastguard Worker {
53*03ce13f7SAndroid Build Coastguard Worker if(info.mapEntryCount != rhs.info.mapEntryCount)
54*03ce13f7SAndroid Build Coastguard Worker {
55*03ce13f7SAndroid Build Coastguard Worker return info.mapEntryCount < rhs.info.mapEntryCount;
56*03ce13f7SAndroid Build Coastguard Worker }
57*03ce13f7SAndroid Build Coastguard Worker
58*03ce13f7SAndroid Build Coastguard Worker if(info.dataSize != rhs.info.dataSize)
59*03ce13f7SAndroid Build Coastguard Worker {
60*03ce13f7SAndroid Build Coastguard Worker return info.dataSize < rhs.info.dataSize;
61*03ce13f7SAndroid Build Coastguard Worker }
62*03ce13f7SAndroid Build Coastguard Worker
63*03ce13f7SAndroid Build Coastguard Worker if(info.mapEntryCount > 0)
64*03ce13f7SAndroid Build Coastguard Worker {
65*03ce13f7SAndroid Build Coastguard Worker int cmp = memcmp(info.pMapEntries, rhs.info.pMapEntries, info.mapEntryCount * sizeof(VkSpecializationMapEntry));
66*03ce13f7SAndroid Build Coastguard Worker if(cmp != 0)
67*03ce13f7SAndroid Build Coastguard Worker {
68*03ce13f7SAndroid Build Coastguard Worker return cmp < 0;
69*03ce13f7SAndroid Build Coastguard Worker }
70*03ce13f7SAndroid Build Coastguard Worker }
71*03ce13f7SAndroid Build Coastguard Worker
72*03ce13f7SAndroid Build Coastguard Worker if(info.dataSize > 0)
73*03ce13f7SAndroid Build Coastguard Worker {
74*03ce13f7SAndroid Build Coastguard Worker int cmp = memcmp(info.pData, rhs.info.pData, info.dataSize);
75*03ce13f7SAndroid Build Coastguard Worker if(cmp != 0)
76*03ce13f7SAndroid Build Coastguard Worker {
77*03ce13f7SAndroid Build Coastguard Worker return cmp < 0;
78*03ce13f7SAndroid Build Coastguard Worker }
79*03ce13f7SAndroid Build Coastguard Worker }
80*03ce13f7SAndroid Build Coastguard Worker
81*03ce13f7SAndroid Build Coastguard Worker return false;
82*03ce13f7SAndroid Build Coastguard Worker }
83*03ce13f7SAndroid Build Coastguard Worker
84*03ce13f7SAndroid Build Coastguard Worker } // namespace vk
85