18bf80f4bSopenharmony_ci/* 28bf80f4bSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 38bf80f4bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48bf80f4bSopenharmony_ci * you may not use this file except in compliance with the License. 58bf80f4bSopenharmony_ci * You may obtain a copy of the License at 68bf80f4bSopenharmony_ci * 78bf80f4bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88bf80f4bSopenharmony_ci * 98bf80f4bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108bf80f4bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118bf80f4bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128bf80f4bSopenharmony_ci * See the License for the specific language governing permissions and 138bf80f4bSopenharmony_ci * limitations under the License. 148bf80f4bSopenharmony_ci */ 158bf80f4bSopenharmony_ci 168bf80f4bSopenharmony_ci#include "util/property_util.h" 178bf80f4bSopenharmony_ci 188bf80f4bSopenharmony_ci#include <PropertyTools/core_metadata.inl> 198bf80f4bSopenharmony_ci#include <cinttypes> 208bf80f4bSopenharmony_ci 218bf80f4bSopenharmony_ci#include <base/math/vector.h> 228bf80f4bSopenharmony_ci#include <core/log.h> 238bf80f4bSopenharmony_ci#include <core/property/intf_property_handle.h> 248bf80f4bSopenharmony_ci#include <core/property/property_types.h> 258bf80f4bSopenharmony_ci#include <render/property/property_types.h> 268bf80f4bSopenharmony_ci 278bf80f4bSopenharmony_ci#include "util/json_util.h" 288bf80f4bSopenharmony_ci#include "util/log.h" 298bf80f4bSopenharmony_ci 308bf80f4bSopenharmony_ciRENDER_BEGIN_NAMESPACE() 318bf80f4bSopenharmony_ciusing namespace BASE_NS; 328bf80f4bSopenharmony_ciusing namespace CORE_NS; 338bf80f4bSopenharmony_ci 348bf80f4bSopenharmony_cinamespace { 358bf80f4bSopenharmony_ciconstexpr size_t BUFFER_HANDLE_REF_BYTE_SIZE = sizeof(BindableBufferWithHandleReference); 368bf80f4bSopenharmony_ciconstexpr size_t IMAGE_HANDLE_REF_BYTE_SIZE = sizeof(BindableImageWithHandleReference); 378bf80f4bSopenharmony_ciconstexpr size_t SAMPLER_HANDLE_REF_BYTE_SIZE = sizeof(BindableSamplerWithHandleReference); 388bf80f4bSopenharmony_ciconstexpr size_t MAX_STRUCT_HANDLE_REF_BYTE_SIZE = 398bf80f4bSopenharmony_ci Math::max(BUFFER_HANDLE_REF_BYTE_SIZE, Math::max(IMAGE_HANDLE_REF_BYTE_SIZE, SAMPLER_HANDLE_REF_BYTE_SIZE)); 408bf80f4bSopenharmony_ci 418bf80f4bSopenharmony_ciuint32_t GetPropertyTypeByteSize(const PropertyTypeDecl& typeDecl) 428bf80f4bSopenharmony_ci{ 438bf80f4bSopenharmony_ci uint32_t byteSize = 0; // zero means that un-supported property type 448bf80f4bSopenharmony_ci switch (typeDecl) { 458bf80f4bSopenharmony_ci case PropertyType::UINT32_T: 468bf80f4bSopenharmony_ci case PropertyType::INT32_T: 478bf80f4bSopenharmony_ci case PropertyType::FLOAT_T: 488bf80f4bSopenharmony_ci case PropertyType::BOOL_T: 498bf80f4bSopenharmony_ci byteSize = sizeof(uint32_t); 508bf80f4bSopenharmony_ci break; 518bf80f4bSopenharmony_ci case PropertyType::UVEC2_T: 528bf80f4bSopenharmony_ci case PropertyType::IVEC2_T: 538bf80f4bSopenharmony_ci case PropertyType::VEC2_T: 548bf80f4bSopenharmony_ci byteSize = sizeof(Math::UVec2); 558bf80f4bSopenharmony_ci break; 568bf80f4bSopenharmony_ci case PropertyType::UVEC3_T: 578bf80f4bSopenharmony_ci case PropertyType::IVEC3_T: 588bf80f4bSopenharmony_ci case PropertyType::VEC3_T: 598bf80f4bSopenharmony_ci byteSize = sizeof(Math::UVec3); 608bf80f4bSopenharmony_ci break; 618bf80f4bSopenharmony_ci case PropertyType::UVEC4_T: 628bf80f4bSopenharmony_ci case PropertyType::IVEC4_T: 638bf80f4bSopenharmony_ci case PropertyType::VEC4_T: 648bf80f4bSopenharmony_ci byteSize = sizeof(Math::UVec4); 658bf80f4bSopenharmony_ci break; 668bf80f4bSopenharmony_ci case PropertyType::MAT3X3_T: 678bf80f4bSopenharmony_ci byteSize = sizeof(Math::Mat3X3); 688bf80f4bSopenharmony_ci break; 698bf80f4bSopenharmony_ci case PropertyType::MAT4X4_T: 708bf80f4bSopenharmony_ci byteSize = sizeof(Math::Mat4X4); 718bf80f4bSopenharmony_ci break; 728bf80f4bSopenharmony_ci } 738bf80f4bSopenharmony_ci return byteSize; 748bf80f4bSopenharmony_ci} 758bf80f4bSopenharmony_ci 768bf80f4bSopenharmony_ciconstexpr MetaData GetMetaData(const PropertyTypeDecl& typeDecl) 778bf80f4bSopenharmony_ci{ 788bf80f4bSopenharmony_ci switch (typeDecl) { 798bf80f4bSopenharmony_ci case PropertyType::UINT32_T: 808bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<uint32_t>(nullptr); 818bf80f4bSopenharmony_ci case PropertyType::INT32_T: 828bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<int32_t>(nullptr); 838bf80f4bSopenharmony_ci case PropertyType::FLOAT_T: 848bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<float>(nullptr); 858bf80f4bSopenharmony_ci 868bf80f4bSopenharmony_ci case PropertyType::BOOL_T: 878bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<bool>(nullptr); 888bf80f4bSopenharmony_ci 898bf80f4bSopenharmony_ci case PropertyType::UVEC2_T: 908bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::UVec2>(nullptr); 918bf80f4bSopenharmony_ci case PropertyType::IVEC2_T: 928bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::IVec2>(nullptr); 938bf80f4bSopenharmony_ci case PropertyType::VEC2_T: 948bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::Vec2>(nullptr); 958bf80f4bSopenharmony_ci 968bf80f4bSopenharmony_ci case PropertyType::UVEC3_T: 978bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::UVec3>(nullptr); 988bf80f4bSopenharmony_ci case PropertyType::IVEC3_T: 998bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::IVec3>(nullptr); 1008bf80f4bSopenharmony_ci case PropertyType::VEC3_T: 1018bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::Vec3>(nullptr); 1028bf80f4bSopenharmony_ci 1038bf80f4bSopenharmony_ci case PropertyType::UVEC4_T: 1048bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::UVec4>(nullptr); 1058bf80f4bSopenharmony_ci case PropertyType::IVEC4_T: 1068bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::IVec4>(nullptr); 1078bf80f4bSopenharmony_ci case PropertyType::VEC4_T: 1088bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::Vec4>(nullptr); 1098bf80f4bSopenharmony_ci 1108bf80f4bSopenharmony_ci case PropertyType::MAT3X3_T: 1118bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::Mat3X3>(nullptr); 1128bf80f4bSopenharmony_ci case PropertyType::MAT4X4_T: 1138bf80f4bSopenharmony_ci return PropertyType::MetaDataFrom<Math::Mat4X4>(nullptr); 1148bf80f4bSopenharmony_ci } 1158bf80f4bSopenharmony_ci return {}; 1168bf80f4bSopenharmony_ci} 1178bf80f4bSopenharmony_ci} // namespace 1188bf80f4bSopenharmony_ci 1198bf80f4bSopenharmony_ciCustomPropertyPodContainer::CustomPropertyPodContainer(size_t reserveByteSize) 1208bf80f4bSopenharmony_ci{ 1218bf80f4bSopenharmony_ci data_.reserve(reserveByteSize); 1228bf80f4bSopenharmony_ci} 1238bf80f4bSopenharmony_ci 1248bf80f4bSopenharmony_cisize_t CustomPropertyPodContainer::PropertyCount() const 1258bf80f4bSopenharmony_ci{ 1268bf80f4bSopenharmony_ci return metaData_.size(); 1278bf80f4bSopenharmony_ci} 1288bf80f4bSopenharmony_ci 1298bf80f4bSopenharmony_ciconst Property* CustomPropertyPodContainer::MetaData(size_t index) const 1308bf80f4bSopenharmony_ci{ 1318bf80f4bSopenharmony_ci if (index < metaData_.size()) { 1328bf80f4bSopenharmony_ci return &metaData_[index]; 1338bf80f4bSopenharmony_ci } 1348bf80f4bSopenharmony_ci 1358bf80f4bSopenharmony_ci return nullptr; 1368bf80f4bSopenharmony_ci} 1378bf80f4bSopenharmony_ci 1388bf80f4bSopenharmony_ciarray_view<const Property> CustomPropertyPodContainer::MetaData() const 1398bf80f4bSopenharmony_ci{ 1408bf80f4bSopenharmony_ci return { metaData_ }; 1418bf80f4bSopenharmony_ci} 1428bf80f4bSopenharmony_ci 1438bf80f4bSopenharmony_ciuint64_t CustomPropertyPodContainer::Type() const 1448bf80f4bSopenharmony_ci{ 1458bf80f4bSopenharmony_ci return 0; 1468bf80f4bSopenharmony_ci} 1478bf80f4bSopenharmony_ci 1488bf80f4bSopenharmony_ciIPropertyHandle* CustomPropertyPodContainer::Create() const 1498bf80f4bSopenharmony_ci{ 1508bf80f4bSopenharmony_ci return nullptr; 1518bf80f4bSopenharmony_ci} 1528bf80f4bSopenharmony_ci 1538bf80f4bSopenharmony_ciIPropertyHandle* CustomPropertyPodContainer::Clone(const IPropertyHandle* src) const 1548bf80f4bSopenharmony_ci{ 1558bf80f4bSopenharmony_ci return nullptr; 1568bf80f4bSopenharmony_ci} 1578bf80f4bSopenharmony_ci 1588bf80f4bSopenharmony_civoid CustomPropertyPodContainer::Release(IPropertyHandle* handle) const {} 1598bf80f4bSopenharmony_ci 1608bf80f4bSopenharmony_civoid CustomPropertyPodContainer::Reset() 1618bf80f4bSopenharmony_ci{ 1628bf80f4bSopenharmony_ci metaStrings_.clear(); 1638bf80f4bSopenharmony_ci metaData_.clear(); 1648bf80f4bSopenharmony_ci data_.clear(); 1658bf80f4bSopenharmony_ci} 1668bf80f4bSopenharmony_ci 1678bf80f4bSopenharmony_civoid CustomPropertyPodContainer::ReservePropertyCount(size_t propertyCount) 1688bf80f4bSopenharmony_ci{ 1698bf80f4bSopenharmony_ci reservePropertyCount_ = propertyCount; 1708bf80f4bSopenharmony_ci metaStrings_.reserve(reservePropertyCount_); 1718bf80f4bSopenharmony_ci metaData_.reserve(reservePropertyCount_); 1728bf80f4bSopenharmony_ci} 1738bf80f4bSopenharmony_ci 1748bf80f4bSopenharmony_ci// CustomProperties IPropertyHandle 1758bf80f4bSopenharmony_ciconst IPropertyApi* CustomPropertyPodContainer::Owner() const 1768bf80f4bSopenharmony_ci{ 1778bf80f4bSopenharmony_ci return this; 1788bf80f4bSopenharmony_ci} 1798bf80f4bSopenharmony_ci 1808bf80f4bSopenharmony_cisize_t CustomPropertyPodContainer::Size() const 1818bf80f4bSopenharmony_ci{ 1828bf80f4bSopenharmony_ci return data_.size(); 1838bf80f4bSopenharmony_ci} 1848bf80f4bSopenharmony_ci 1858bf80f4bSopenharmony_ciconst void* CustomPropertyPodContainer::RLock() const 1868bf80f4bSopenharmony_ci{ 1878bf80f4bSopenharmony_ci return data_.data(); 1888bf80f4bSopenharmony_ci} 1898bf80f4bSopenharmony_ci 1908bf80f4bSopenharmony_civoid CustomPropertyPodContainer::RUnlock() const {} 1918bf80f4bSopenharmony_ci 1928bf80f4bSopenharmony_civoid* CustomPropertyPodContainer::WLock() 1938bf80f4bSopenharmony_ci{ 1948bf80f4bSopenharmony_ci return data_.data(); 1958bf80f4bSopenharmony_ci} 1968bf80f4bSopenharmony_ci 1978bf80f4bSopenharmony_civoid CustomPropertyPodContainer::WUnlock() {} 1988bf80f4bSopenharmony_ci 1998bf80f4bSopenharmony_ci// 2008bf80f4bSopenharmony_ci 2018bf80f4bSopenharmony_civoid CustomPropertyPodContainer::AddOffsetProperty(const string_view propertyName, const string_view displayName, 2028bf80f4bSopenharmony_ci const uintptr_t offset, const PropertyTypeDecl& typeDecl) 2038bf80f4bSopenharmony_ci{ 2048bf80f4bSopenharmony_ci const size_t byteSize = GetPropertyTypeByteSize(typeDecl); 2058bf80f4bSopenharmony_ci const bool reserved = (metaStrings_.size() < reservePropertyCount_); 2068bf80f4bSopenharmony_ci if ((byteSize > 0) && reserved) { 2078bf80f4bSopenharmony_ci metaStrings_.push_back({ string { propertyName }, string { displayName } }); 2088bf80f4bSopenharmony_ci const auto& strings = metaStrings_.back(); 2098bf80f4bSopenharmony_ci const Property meta { 2108bf80f4bSopenharmony_ci strings.name, // name 2118bf80f4bSopenharmony_ci FNV1aHash(strings.name.data(), strings.name.size()), // hash 2128bf80f4bSopenharmony_ci typeDecl, // type 2138bf80f4bSopenharmony_ci 1U, // count 2148bf80f4bSopenharmony_ci byteSize, // size 2158bf80f4bSopenharmony_ci offset, // offset 2168bf80f4bSopenharmony_ci strings.displayName, // displayName 2178bf80f4bSopenharmony_ci 0U, // flags 2188bf80f4bSopenharmony_ci GetMetaData(typeDecl), // metaData 2198bf80f4bSopenharmony_ci }; 2208bf80f4bSopenharmony_ci metaData_.push_back(meta); 2218bf80f4bSopenharmony_ci data_.resize(Math::max(data_.size(), meta.offset + meta.size)); 2228bf80f4bSopenharmony_ci } else { 2238bf80f4bSopenharmony_ci CORE_LOG_W("unsupported property addition for custom property POD container"); 2248bf80f4bSopenharmony_ci } 2258bf80f4bSopenharmony_ci} 2268bf80f4bSopenharmony_ci 2278bf80f4bSopenharmony_civoid CustomPropertyPodContainer::AddOffsetProperty(const string_view propertyName, const string_view displayName, 2288bf80f4bSopenharmony_ci const uintptr_t offset, const PropertyTypeDecl& typeDecl, const array_view<const uint8_t> data) 2298bf80f4bSopenharmony_ci{ 2308bf80f4bSopenharmony_ci const size_t byteSize = GetPropertyTypeByteSize(typeDecl); 2318bf80f4bSopenharmony_ci const bool reserved = (metaStrings_.size() < reservePropertyCount_); 2328bf80f4bSopenharmony_ci if ((byteSize > 0) && reserved) { 2338bf80f4bSopenharmony_ci metaStrings_.push_back({ string { propertyName }, string { displayName } }); 2348bf80f4bSopenharmony_ci const auto& strings = metaStrings_.back(); 2358bf80f4bSopenharmony_ci const Property meta { 2368bf80f4bSopenharmony_ci strings.name, // name 2378bf80f4bSopenharmony_ci FNV1aHash(strings.name.data(), strings.name.size()), // hash 2388bf80f4bSopenharmony_ci typeDecl, // type 2398bf80f4bSopenharmony_ci 1U, // count 2408bf80f4bSopenharmony_ci byteSize, // size 2418bf80f4bSopenharmony_ci offset, // offset 2428bf80f4bSopenharmony_ci strings.displayName, // displayName 2438bf80f4bSopenharmony_ci 0U, // flags 2448bf80f4bSopenharmony_ci GetMetaData(typeDecl), // metaData 2458bf80f4bSopenharmony_ci }; 2468bf80f4bSopenharmony_ci metaData_.push_back(meta); 2478bf80f4bSopenharmony_ci data_.resize(data_.size() + meta.size); 2488bf80f4bSopenharmony_ci if (data.size_bytes() == byteSize) { 2498bf80f4bSopenharmony_ci CloneData(data_.data() + offset, data_.size_in_bytes(), data.data(), data.size_bytes()); 2508bf80f4bSopenharmony_ci } 2518bf80f4bSopenharmony_ci } else { 2528bf80f4bSopenharmony_ci CORE_LOG_W("unsupported property addition for custom property POD container"); 2538bf80f4bSopenharmony_ci } 2548bf80f4bSopenharmony_ci} 2558bf80f4bSopenharmony_ci 2568bf80f4bSopenharmony_cibool CustomPropertyPodContainer::SetValue(const string_view propertyName, const array_view<uint8_t> data) 2578bf80f4bSopenharmony_ci{ 2588bf80f4bSopenharmony_ci for (const auto& metaRef : metaData_) { 2598bf80f4bSopenharmony_ci if ((metaRef.displayName == propertyName) && (metaRef.size == data.size_bytes())) { 2608bf80f4bSopenharmony_ci const size_t endData = metaRef.offset + metaRef.size; 2618bf80f4bSopenharmony_ci if (endData <= data_.size_in_bytes()) { 2628bf80f4bSopenharmony_ci CloneData(data_.data() + metaRef.offset, data_.size_in_bytes(), data.data(), data.size_bytes()); 2638bf80f4bSopenharmony_ci return true; 2648bf80f4bSopenharmony_ci } 2658bf80f4bSopenharmony_ci } 2668bf80f4bSopenharmony_ci } 2678bf80f4bSopenharmony_ci return false; 2688bf80f4bSopenharmony_ci} 2698bf80f4bSopenharmony_ci 2708bf80f4bSopenharmony_cibool CustomPropertyPodContainer::SetValue(const size_t byteOffset, const array_view<uint8_t> data) 2718bf80f4bSopenharmony_ci{ 2728bf80f4bSopenharmony_ci const size_t endData = byteOffset + data.size_bytes(); 2738bf80f4bSopenharmony_ci if (endData <= data_.size_in_bytes()) { 2748bf80f4bSopenharmony_ci CloneData(data_.data() + byteOffset, data_.size_in_bytes(), data.data(), data.size_bytes()); 2758bf80f4bSopenharmony_ci return true; 2768bf80f4bSopenharmony_ci } 2778bf80f4bSopenharmony_ci return false; 2788bf80f4bSopenharmony_ci} 2798bf80f4bSopenharmony_ci 2808bf80f4bSopenharmony_ciarray_view<const uint8_t> CustomPropertyPodContainer::GetValue(const string_view propertyName) const 2818bf80f4bSopenharmony_ci{ 2828bf80f4bSopenharmony_ci for (const auto& metaRef : metaData_) { 2838bf80f4bSopenharmony_ci if (metaRef.displayName == propertyName) { 2848bf80f4bSopenharmony_ci const size_t endData = metaRef.offset + metaRef.size; 2858bf80f4bSopenharmony_ci if (endData <= data_.size_in_bytes()) { 2868bf80f4bSopenharmony_ci return { data_.data() + metaRef.offset, metaRef.size }; 2878bf80f4bSopenharmony_ci } 2888bf80f4bSopenharmony_ci } 2898bf80f4bSopenharmony_ci } 2908bf80f4bSopenharmony_ci return {}; 2918bf80f4bSopenharmony_ci} 2928bf80f4bSopenharmony_ci 2938bf80f4bSopenharmony_cisize_t CustomPropertyPodContainer::GetByteSize() const 2948bf80f4bSopenharmony_ci{ 2958bf80f4bSopenharmony_ci return data_.size_in_bytes(); 2968bf80f4bSopenharmony_ci} 2978bf80f4bSopenharmony_ci 2988bf80f4bSopenharmony_ciBASE_NS::array_view<const uint8_t> CustomPropertyPodContainer::GetData() const 2998bf80f4bSopenharmony_ci{ 3008bf80f4bSopenharmony_ci return data_; 3018bf80f4bSopenharmony_ci} 3028bf80f4bSopenharmony_ci 3038bf80f4bSopenharmony_ci// 3048bf80f4bSopenharmony_ci 3058bf80f4bSopenharmony_ciPropertyTypeDecl CustomPropertyPodHelper::GetPropertyTypeDeclaration(const string_view type) 3068bf80f4bSopenharmony_ci{ 3078bf80f4bSopenharmony_ci if (type == "vec4") { 3088bf80f4bSopenharmony_ci return PropertyType::VEC4_T; 3098bf80f4bSopenharmony_ci } else if (type == "uvec4") { 3108bf80f4bSopenharmony_ci return PropertyType::UVEC4_T; 3118bf80f4bSopenharmony_ci } else if (type == "ivec4") { 3128bf80f4bSopenharmony_ci return PropertyType::IVEC4_T; 3138bf80f4bSopenharmony_ci } else if (type == "vec3") { 3148bf80f4bSopenharmony_ci return PropertyType::VEC3_T; 3158bf80f4bSopenharmony_ci } else if (type == "uvec3") { 3168bf80f4bSopenharmony_ci return PropertyType::UVEC3_T; 3178bf80f4bSopenharmony_ci } else if (type == "ivec3") { 3188bf80f4bSopenharmony_ci return PropertyType::IVEC3_T; 3198bf80f4bSopenharmony_ci } else if (type == "vec2") { 3208bf80f4bSopenharmony_ci return PropertyType::VEC2_T; 3218bf80f4bSopenharmony_ci } else if (type == "uvec2") { 3228bf80f4bSopenharmony_ci return PropertyType::UVEC2_T; 3238bf80f4bSopenharmony_ci } else if (type == "ivec2") { 3248bf80f4bSopenharmony_ci return PropertyType::IVEC2_T; 3258bf80f4bSopenharmony_ci } else if (type == "float") { 3268bf80f4bSopenharmony_ci return PropertyType::FLOAT_T; 3278bf80f4bSopenharmony_ci } else if (type == "uint") { 3288bf80f4bSopenharmony_ci return PropertyType::UINT32_T; 3298bf80f4bSopenharmony_ci } else if (type == "int") { 3308bf80f4bSopenharmony_ci return PropertyType::INT32_T; 3318bf80f4bSopenharmony_ci } else if (type == "bool") { 3328bf80f4bSopenharmony_ci return PropertyType::BOOL_T; 3338bf80f4bSopenharmony_ci } else if (type == "mat3x3") { 3348bf80f4bSopenharmony_ci return PropertyType::MAT3X3_T; 3358bf80f4bSopenharmony_ci } else if (type == "mat4x4") { 3368bf80f4bSopenharmony_ci return PropertyType::MAT4X4_T; 3378bf80f4bSopenharmony_ci } else { 3388bf80f4bSopenharmony_ci CORE_LOG_W("RENDER_VALIDATION: Invalid property type only int, uint, float, bool, and XvecX variants, and " 3398bf80f4bSopenharmony_ci "mat3x3 and mat4x4 are supported"); 3408bf80f4bSopenharmony_ci } 3418bf80f4bSopenharmony_ci // NOTE: does not handle invalid types 3428bf80f4bSopenharmony_ci return PropertyType::INVALID; 3438bf80f4bSopenharmony_ci} 3448bf80f4bSopenharmony_ci 3458bf80f4bSopenharmony_cisize_t CustomPropertyPodHelper::GetPropertyTypeAlignment(const PropertyTypeDecl& propertyType) 3468bf80f4bSopenharmony_ci{ 3478bf80f4bSopenharmony_ci size_t align = 1U; 3488bf80f4bSopenharmony_ci static_assert(sizeof(float) == sizeof(uint32_t) && sizeof(float) == sizeof(int32_t)); 3498bf80f4bSopenharmony_ci switch (propertyType) { 3508bf80f4bSopenharmony_ci case PropertyType::FLOAT_T: 3518bf80f4bSopenharmony_ci [[fallthrough]]; 3528bf80f4bSopenharmony_ci case PropertyType::UINT32_T: 3538bf80f4bSopenharmony_ci [[fallthrough]]; 3548bf80f4bSopenharmony_ci case PropertyType::INT32_T: 3558bf80f4bSopenharmony_ci [[fallthrough]]; 3568bf80f4bSopenharmony_ci case PropertyType::BOOL_T: 3578bf80f4bSopenharmony_ci align = sizeof(float); 3588bf80f4bSopenharmony_ci break; 3598bf80f4bSopenharmony_ci case PropertyType::VEC2_T: 3608bf80f4bSopenharmony_ci [[fallthrough]]; 3618bf80f4bSopenharmony_ci case PropertyType::UVEC2_T: 3628bf80f4bSopenharmony_ci [[fallthrough]]; 3638bf80f4bSopenharmony_ci case PropertyType::IVEC2_T: 3648bf80f4bSopenharmony_ci align = sizeof(float) * 2U; 3658bf80f4bSopenharmony_ci break; 3668bf80f4bSopenharmony_ci case PropertyType::VEC3_T: 3678bf80f4bSopenharmony_ci [[fallthrough]]; 3688bf80f4bSopenharmony_ci case PropertyType::UVEC3_T: 3698bf80f4bSopenharmony_ci [[fallthrough]]; 3708bf80f4bSopenharmony_ci case PropertyType::IVEC3_T: 3718bf80f4bSopenharmony_ci [[fallthrough]]; 3728bf80f4bSopenharmony_ci case PropertyType::VEC4_T: 3738bf80f4bSopenharmony_ci [[fallthrough]]; 3748bf80f4bSopenharmony_ci case PropertyType::UVEC4_T: 3758bf80f4bSopenharmony_ci [[fallthrough]]; 3768bf80f4bSopenharmony_ci case PropertyType::IVEC4_T: 3778bf80f4bSopenharmony_ci align = sizeof(float) * 4U; 3788bf80f4bSopenharmony_ci break; 3798bf80f4bSopenharmony_ci case PropertyType::MAT3X3_T: 3808bf80f4bSopenharmony_ci align = sizeof(float) * 4U * 3U; 3818bf80f4bSopenharmony_ci break; 3828bf80f4bSopenharmony_ci case PropertyType::MAT4X4_T: 3838bf80f4bSopenharmony_ci align = sizeof(float) * 4U * 4U; 3848bf80f4bSopenharmony_ci break; 3858bf80f4bSopenharmony_ci } 3868bf80f4bSopenharmony_ci return align; 3878bf80f4bSopenharmony_ci} 3888bf80f4bSopenharmony_ci 3898bf80f4bSopenharmony_civoid CustomPropertyPodHelper::SetCustomPropertyBlobValue(const PropertyTypeDecl& propertyType, const json::value* value, 3908bf80f4bSopenharmony_ci CustomPropertyPodContainer& customProperties, const size_t offset) 3918bf80f4bSopenharmony_ci{ 3928bf80f4bSopenharmony_ci if (propertyType == PropertyType::VEC4_T) { 3938bf80f4bSopenharmony_ci Math::Vec4 val; 3948bf80f4bSopenharmony_ci FromJson(*value, val); 3958bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Vec4) }); 3968bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::UVEC4_T) { 3978bf80f4bSopenharmony_ci Math::UVec4 val; 3988bf80f4bSopenharmony_ci FromJson(*value, val); 3998bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Vec4) }); 4008bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::IVEC4_T) { 4018bf80f4bSopenharmony_ci Math::IVec4 val; 4028bf80f4bSopenharmony_ci FromJson(*value, val); 4038bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Vec4) }); 4048bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::VEC3_T) { 4058bf80f4bSopenharmony_ci Math::Vec3 val; 4068bf80f4bSopenharmony_ci FromJson(*value, val); 4078bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Vec3) }); 4088bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::UVEC3_T) { 4098bf80f4bSopenharmony_ci Math::UVec3 val; 4108bf80f4bSopenharmony_ci FromJson(*value, val); 4118bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Vec3) }); 4128bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::IVEC3_T) { 4138bf80f4bSopenharmony_ci Math::IVec3 val; 4148bf80f4bSopenharmony_ci FromJson(*value, val); 4158bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Vec3) }); 4168bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::VEC2_T) { 4178bf80f4bSopenharmony_ci Math::Vec2 val; 4188bf80f4bSopenharmony_ci FromJson(*value, val); 4198bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Vec2) }); 4208bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::UVEC2_T) { 4218bf80f4bSopenharmony_ci Math::UVec2 val; 4228bf80f4bSopenharmony_ci FromJson(*value, val); 4238bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Vec2) }); 4248bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::IVEC2_T) { 4258bf80f4bSopenharmony_ci Math::IVec2 val; 4268bf80f4bSopenharmony_ci FromJson(*value, val); 4278bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Vec2) }); 4288bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::FLOAT_T) { 4298bf80f4bSopenharmony_ci float val; 4308bf80f4bSopenharmony_ci FromJson(*value, val); 4318bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(float) }); 4328bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::UINT32_T) { 4338bf80f4bSopenharmony_ci uint32_t val; 4348bf80f4bSopenharmony_ci FromJson(*value, val); 4358bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(float) }); 4368bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::INT32_T) { 4378bf80f4bSopenharmony_ci int32_t val; 4388bf80f4bSopenharmony_ci FromJson(*value, val); 4398bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(float) }); 4408bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::BOOL_T) { 4418bf80f4bSopenharmony_ci bool tmpVal; 4428bf80f4bSopenharmony_ci FromJson(*value, tmpVal); 4438bf80f4bSopenharmony_ci uint32_t val = tmpVal; 4448bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(float) }); 4458bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::MAT3X3_T) { 4468bf80f4bSopenharmony_ci Math::Mat3X3 val; 4478bf80f4bSopenharmony_ci FromJson(*value, val); 4488bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Mat3X3) }); 4498bf80f4bSopenharmony_ci } else if (propertyType == PropertyType::MAT4X4_T) { 4508bf80f4bSopenharmony_ci Math::Mat4X4 val; 4518bf80f4bSopenharmony_ci FromJson(*value, val); 4528bf80f4bSopenharmony_ci customProperties.SetValue(offset, array_view { reinterpret_cast<uint8_t*>(&val), sizeof(Math::Mat4X4) }); 4538bf80f4bSopenharmony_ci } else { 4548bf80f4bSopenharmony_ci CORE_LOG_W("RENDER_VALIDATION: Invalid property type only int, uint, float, and XvecX variants supported"); 4558bf80f4bSopenharmony_ci } 4568bf80f4bSopenharmony_ci // NOTE: does not handle invalid types 4578bf80f4bSopenharmony_ci} 4588bf80f4bSopenharmony_ci 4598bf80f4bSopenharmony_ci// bindings 4608bf80f4bSopenharmony_ci 4618bf80f4bSopenharmony_citemplate<typename T> 4628bf80f4bSopenharmony_ciinline void DestroyHelper(T& t) 4638bf80f4bSopenharmony_ci{ 4648bf80f4bSopenharmony_ci { 4658bf80f4bSopenharmony_ci t.~T(); 4668bf80f4bSopenharmony_ci } 4678bf80f4bSopenharmony_ci} 4688bf80f4bSopenharmony_ci 4698bf80f4bSopenharmony_ciCustomPropertyBindingContainer::CustomPropertyBindingContainer(CustomPropertyWriteSignal& writeSignal) 4708bf80f4bSopenharmony_ci : writeSignal_(writeSignal) 4718bf80f4bSopenharmony_ci{} 4728bf80f4bSopenharmony_ci 4738bf80f4bSopenharmony_ciCustomPropertyBindingContainer::~CustomPropertyBindingContainer() 4748bf80f4bSopenharmony_ci{ 4758bf80f4bSopenharmony_ci if (!data_.empty()) { 4768bf80f4bSopenharmony_ci const uint32_t tmp = MAX_STRUCT_HANDLE_REF_BYTE_SIZE; 4778bf80f4bSopenharmony_ci PLUGIN_ASSERT(metaData_.size() <= data_.size()); 4788bf80f4bSopenharmony_ci for (size_t idx = 0; idx < metaData_.size(); ++idx) { 4798bf80f4bSopenharmony_ci const auto& meta = metaData_[idx]; 4808bf80f4bSopenharmony_ci CORE_ASSERT(meta.offset < data_.size_in_bytes()); 4818bf80f4bSopenharmony_ci switch (meta.type) { 4828bf80f4bSopenharmony_ci case PropertyType::BINDABLE_BUFFER_WITH_HANDLE_REFERENCE_T: { 4838bf80f4bSopenharmony_ci PLUGIN_ASSERT(meta.size == BUFFER_HANDLE_REF_BYTE_SIZE); 4848bf80f4bSopenharmony_ci if (BindableBufferWithHandleReference* resource = 4858bf80f4bSopenharmony_ci (BindableBufferWithHandleReference*)(data_.data() + meta.offset); 4868bf80f4bSopenharmony_ci resource) { 4878bf80f4bSopenharmony_ci DestroyHelper(*resource); 4888bf80f4bSopenharmony_ci } 4898bf80f4bSopenharmony_ci } 4908bf80f4bSopenharmony_ci break; 4918bf80f4bSopenharmony_ci case PropertyType::BINDABLE_IMAGE_WITH_HANDLE_REFERENCE_T: { 4928bf80f4bSopenharmony_ci PLUGIN_ASSERT(meta.size == IMAGE_HANDLE_REF_BYTE_SIZE); 4938bf80f4bSopenharmony_ci if (BindableImageWithHandleReference* resource = 4948bf80f4bSopenharmony_ci (BindableImageWithHandleReference*)(data_.data() + meta.offset); 4958bf80f4bSopenharmony_ci resource) { 4968bf80f4bSopenharmony_ci DestroyHelper(*resource); 4978bf80f4bSopenharmony_ci } 4988bf80f4bSopenharmony_ci } 4998bf80f4bSopenharmony_ci break; 5008bf80f4bSopenharmony_ci case PropertyType::BINDABLE_SAMPLER_WITH_HANDLE_REFERENCE_T: { 5018bf80f4bSopenharmony_ci PLUGIN_ASSERT(meta.size == SAMPLER_HANDLE_REF_BYTE_SIZE); 5028bf80f4bSopenharmony_ci if (BindableSamplerWithHandleReference* resource = 5038bf80f4bSopenharmony_ci (BindableSamplerWithHandleReference*)(data_.data() + meta.offset); 5048bf80f4bSopenharmony_ci resource) { 5058bf80f4bSopenharmony_ci DestroyHelper(*resource); 5068bf80f4bSopenharmony_ci } 5078bf80f4bSopenharmony_ci } 5088bf80f4bSopenharmony_ci break; 5098bf80f4bSopenharmony_ci default: { 5108bf80f4bSopenharmony_ci CORE_LOG_E("custom property binding destruction error"); 5118bf80f4bSopenharmony_ci } 5128bf80f4bSopenharmony_ci break; 5138bf80f4bSopenharmony_ci } 5148bf80f4bSopenharmony_ci } 5158bf80f4bSopenharmony_ci } 5168bf80f4bSopenharmony_ci} 5178bf80f4bSopenharmony_ci 5188bf80f4bSopenharmony_cisize_t CustomPropertyBindingContainer::PropertyCount() const 5198bf80f4bSopenharmony_ci{ 5208bf80f4bSopenharmony_ci return metaData_.size(); 5218bf80f4bSopenharmony_ci} 5228bf80f4bSopenharmony_ci 5238bf80f4bSopenharmony_ciconst Property* CustomPropertyBindingContainer::MetaData(size_t index) const 5248bf80f4bSopenharmony_ci{ 5258bf80f4bSopenharmony_ci if (index < metaData_.size()) { 5268bf80f4bSopenharmony_ci return &metaData_[index]; 5278bf80f4bSopenharmony_ci } 5288bf80f4bSopenharmony_ci 5298bf80f4bSopenharmony_ci return nullptr; 5308bf80f4bSopenharmony_ci} 5318bf80f4bSopenharmony_ci 5328bf80f4bSopenharmony_ciarray_view<const Property> CustomPropertyBindingContainer::MetaData() const 5338bf80f4bSopenharmony_ci{ 5348bf80f4bSopenharmony_ci return { metaData_ }; 5358bf80f4bSopenharmony_ci} 5368bf80f4bSopenharmony_ci 5378bf80f4bSopenharmony_ciuint64_t CustomPropertyBindingContainer::Type() const 5388bf80f4bSopenharmony_ci{ 5398bf80f4bSopenharmony_ci return 0; 5408bf80f4bSopenharmony_ci} 5418bf80f4bSopenharmony_ci 5428bf80f4bSopenharmony_ciIPropertyHandle* CustomPropertyBindingContainer::Create() const 5438bf80f4bSopenharmony_ci{ 5448bf80f4bSopenharmony_ci return nullptr; 5458bf80f4bSopenharmony_ci} 5468bf80f4bSopenharmony_ci 5478bf80f4bSopenharmony_ciIPropertyHandle* CustomPropertyBindingContainer::Clone(const IPropertyHandle* src) const 5488bf80f4bSopenharmony_ci{ 5498bf80f4bSopenharmony_ci return nullptr; 5508bf80f4bSopenharmony_ci} 5518bf80f4bSopenharmony_ci 5528bf80f4bSopenharmony_civoid CustomPropertyBindingContainer::Release(IPropertyHandle* handle) const {} 5538bf80f4bSopenharmony_ci 5548bf80f4bSopenharmony_civoid CustomPropertyBindingContainer::ReservePropertyCount(size_t propertyCount) 5558bf80f4bSopenharmony_ci{ 5568bf80f4bSopenharmony_ci reservePropertyCount_ = propertyCount; 5578bf80f4bSopenharmony_ci metaStrings_.reserve(reservePropertyCount_); 5588bf80f4bSopenharmony_ci metaData_.reserve(reservePropertyCount_); 5598bf80f4bSopenharmony_ci // max size 5608bf80f4bSopenharmony_ci data_.reserve(reservePropertyCount_ * MAX_STRUCT_HANDLE_REF_BYTE_SIZE); 5618bf80f4bSopenharmony_ci} 5628bf80f4bSopenharmony_ci 5638bf80f4bSopenharmony_ci// CustomProperties IPropertyHandle 5648bf80f4bSopenharmony_ciconst IPropertyApi* CustomPropertyBindingContainer::Owner() const 5658bf80f4bSopenharmony_ci{ 5668bf80f4bSopenharmony_ci return this; 5678bf80f4bSopenharmony_ci} 5688bf80f4bSopenharmony_ci 5698bf80f4bSopenharmony_cisize_t CustomPropertyBindingContainer::Size() const 5708bf80f4bSopenharmony_ci{ 5718bf80f4bSopenharmony_ci return data_.size(); 5728bf80f4bSopenharmony_ci} 5738bf80f4bSopenharmony_ci 5748bf80f4bSopenharmony_ciconst void* CustomPropertyBindingContainer::RLock() const 5758bf80f4bSopenharmony_ci{ 5768bf80f4bSopenharmony_ci return data_.data(); 5778bf80f4bSopenharmony_ci} 5788bf80f4bSopenharmony_ci 5798bf80f4bSopenharmony_civoid CustomPropertyBindingContainer::RUnlock() const {} 5808bf80f4bSopenharmony_ci 5818bf80f4bSopenharmony_civoid* CustomPropertyBindingContainer::WLock() 5828bf80f4bSopenharmony_ci{ 5838bf80f4bSopenharmony_ci return data_.data(); 5848bf80f4bSopenharmony_ci} 5858bf80f4bSopenharmony_ci 5868bf80f4bSopenharmony_civoid CustomPropertyBindingContainer::WUnlock() 5878bf80f4bSopenharmony_ci{ 5888bf80f4bSopenharmony_ci // signal that properties have been written 5898bf80f4bSopenharmony_ci writeSignal_.Signal(); 5908bf80f4bSopenharmony_ci} 5918bf80f4bSopenharmony_ci 5928bf80f4bSopenharmony_ci// 5938bf80f4bSopenharmony_ci 5948bf80f4bSopenharmony_civoid CustomPropertyBindingContainer::AddOffsetProperty(const string_view propertyName, const string_view displayName, 5958bf80f4bSopenharmony_ci const uintptr_t offset, const PropertyTypeDecl& typeDecl) 5968bf80f4bSopenharmony_ci{ 5978bf80f4bSopenharmony_ci const bool reserved = (metaStrings_.size() < reservePropertyCount_); 5988bf80f4bSopenharmony_ci size_t byteSize = 0; 5998bf80f4bSopenharmony_ci switch (typeDecl) { 6008bf80f4bSopenharmony_ci case PropertyType::BINDABLE_BUFFER_WITH_HANDLE_REFERENCE_T: { 6018bf80f4bSopenharmony_ci byteSize = BUFFER_HANDLE_REF_BYTE_SIZE; 6028bf80f4bSopenharmony_ci } 6038bf80f4bSopenharmony_ci break; 6048bf80f4bSopenharmony_ci case PropertyType::BINDABLE_IMAGE_WITH_HANDLE_REFERENCE_T: { 6058bf80f4bSopenharmony_ci byteSize = IMAGE_HANDLE_REF_BYTE_SIZE; 6068bf80f4bSopenharmony_ci } 6078bf80f4bSopenharmony_ci break; 6088bf80f4bSopenharmony_ci case PropertyType::BINDABLE_SAMPLER_WITH_HANDLE_REFERENCE_T: { 6098bf80f4bSopenharmony_ci byteSize = SAMPLER_HANDLE_REF_BYTE_SIZE; 6108bf80f4bSopenharmony_ci } 6118bf80f4bSopenharmony_ci break; 6128bf80f4bSopenharmony_ci } 6138bf80f4bSopenharmony_ci if ((byteSize > 0) && reserved) { 6148bf80f4bSopenharmony_ci metaStrings_.push_back({ string { propertyName }, string { displayName } }); 6158bf80f4bSopenharmony_ci const auto& strings = metaStrings_.back(); 6168bf80f4bSopenharmony_ci const Property meta { 6178bf80f4bSopenharmony_ci strings.name, // name 6188bf80f4bSopenharmony_ci FNV1aHash(strings.name.data(), strings.name.size()), // hash 6198bf80f4bSopenharmony_ci typeDecl, // type 6208bf80f4bSopenharmony_ci 1U, // count 6218bf80f4bSopenharmony_ci byteSize, // size 6228bf80f4bSopenharmony_ci offset, // offset 6238bf80f4bSopenharmony_ci strings.displayName, // displayName 6248bf80f4bSopenharmony_ci 0U, // flags 6258bf80f4bSopenharmony_ci GetMetaData(typeDecl), // metaData 6268bf80f4bSopenharmony_ci }; 6278bf80f4bSopenharmony_ci metaData_.push_back(meta); 6288bf80f4bSopenharmony_ci // the data has already been reserved in ReservePropertyCount() 6298bf80f4bSopenharmony_ci data_.resize(Math::max(data_.size(), meta.offset + meta.size)); 6308bf80f4bSopenharmony_ci switch (meta.type) { 6318bf80f4bSopenharmony_ci case PropertyType::BINDABLE_BUFFER_WITH_HANDLE_REFERENCE_T: { 6328bf80f4bSopenharmony_ci new (data_.data() + meta.offset) BindableBufferWithHandleReference; 6338bf80f4bSopenharmony_ci } 6348bf80f4bSopenharmony_ci break; 6358bf80f4bSopenharmony_ci case PropertyType::BINDABLE_IMAGE_WITH_HANDLE_REFERENCE_T: { 6368bf80f4bSopenharmony_ci new (data_.data() + meta.offset) BindableImageWithHandleReference; 6378bf80f4bSopenharmony_ci } 6388bf80f4bSopenharmony_ci break; 6398bf80f4bSopenharmony_ci case PropertyType::BINDABLE_SAMPLER_WITH_HANDLE_REFERENCE_T: { 6408bf80f4bSopenharmony_ci new (data_.data() + meta.offset) BindableSamplerWithHandleReference; 6418bf80f4bSopenharmony_ci } 6428bf80f4bSopenharmony_ci break; 6438bf80f4bSopenharmony_ci } 6448bf80f4bSopenharmony_ci } else { 6458bf80f4bSopenharmony_ci CORE_LOG_W("unsupported property addition for custom property binding container"); 6468bf80f4bSopenharmony_ci } 6478bf80f4bSopenharmony_ci} 6488bf80f4bSopenharmony_ci 6498bf80f4bSopenharmony_cisize_t CustomPropertyBindingContainer::GetByteSize() const 6508bf80f4bSopenharmony_ci{ 6518bf80f4bSopenharmony_ci return data_.size_in_bytes(); 6528bf80f4bSopenharmony_ci} 6538bf80f4bSopenharmony_ci 6548bf80f4bSopenharmony_ci// CustomPropertyBindingHelper 6558bf80f4bSopenharmony_ci 6568bf80f4bSopenharmony_ciPropertyTypeDecl CustomPropertyBindingHelper::GetPropertyTypeDeclaration(const string_view type) 6578bf80f4bSopenharmony_ci{ 6588bf80f4bSopenharmony_ci if (type == "buffer") { 6598bf80f4bSopenharmony_ci return PropertyType::BINDABLE_BUFFER_WITH_HANDLE_REFERENCE_T; 6608bf80f4bSopenharmony_ci } else if (type == "image") { 6618bf80f4bSopenharmony_ci return PropertyType::BINDABLE_IMAGE_WITH_HANDLE_REFERENCE_T; 6628bf80f4bSopenharmony_ci } else if (type == "sampler") { 6638bf80f4bSopenharmony_ci return PropertyType::BINDABLE_SAMPLER_WITH_HANDLE_REFERENCE_T; 6648bf80f4bSopenharmony_ci } else { 6658bf80f4bSopenharmony_ci CORE_LOG_W("RENDER_VALIDATION: Invalid property type only buffer, image, and sampler supported"); 6668bf80f4bSopenharmony_ci } 6678bf80f4bSopenharmony_ci // NOTE: does not handle invalid types 6688bf80f4bSopenharmony_ci return PropertyType::INVALID; 6698bf80f4bSopenharmony_ci} 6708bf80f4bSopenharmony_ci 6718bf80f4bSopenharmony_cisize_t CustomPropertyBindingHelper::GetPropertyTypeAlignment(const PropertyTypeDecl& propertyType) 6728bf80f4bSopenharmony_ci{ 6738bf80f4bSopenharmony_ci size_t align = 1U; 6748bf80f4bSopenharmony_ci switch (propertyType) { 6758bf80f4bSopenharmony_ci case PropertyType::BINDABLE_BUFFER_WITH_HANDLE_REFERENCE_T: 6768bf80f4bSopenharmony_ci align = sizeof(BindableBufferWithHandleReference); 6778bf80f4bSopenharmony_ci break; 6788bf80f4bSopenharmony_ci case PropertyType::BINDABLE_IMAGE_WITH_HANDLE_REFERENCE_T: 6798bf80f4bSopenharmony_ci align = sizeof(BindableImageWithHandleReference); 6808bf80f4bSopenharmony_ci break; 6818bf80f4bSopenharmony_ci case PropertyType::BINDABLE_SAMPLER_WITH_HANDLE_REFERENCE_T: 6828bf80f4bSopenharmony_ci align = sizeof(BindableSamplerWithHandleReference); 6838bf80f4bSopenharmony_ci break; 6848bf80f4bSopenharmony_ci } 6858bf80f4bSopenharmony_ci return align; 6868bf80f4bSopenharmony_ci} 6878bf80f4bSopenharmony_ciRENDER_END_NAMESPACE()