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