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()