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 &copy)
41cb93a386Sopenharmony_ci    : SpecializationInfo(&copy.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