#define DALI_GRAPHICS_TEXTURE_CREATE_INFO_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
return *this;
}
+ /**
+ * @brief Sets texture GPU data allocation policy
+ *
+ * CREATION will allocate GPU memory at creation time.
+ * UPLOAD will allocate GPU memory at creation with non-empty data,
+ * or upload data time.
+ *
+ * @param[in] value texture allocation policy
+ * @return reference to this structure
+ */
+ auto& SetAllocationPolicy(TextureAllocationPolicy value)
+ {
+ allocationPolicy = value;
+ return *this;
+ }
+
/**
* @brief Sets texture usage flags
*
Format format{};
TextureMipMapFlag mipMapFlag{};
TextureLayout layout{};
+ TextureAllocationPolicy allocationPolicy{};
TextureUsageFlags usageFlags{};
void* data{};
uint32_t dataSize{0u};
OPTIMAL ///< Usually, read-only memory, driver-optimal layout
};
+/**
+ * @brief Texture allocation policy defines when the GPU texture memory is allocated.
+ */
+enum class TextureAllocationPolicy
+{
+ CREATION, ///< GPU Memory will be allocated when creation.
+ UPLOAD, ///< GPU Memory will be allocated when upload image data.
+};
+
/**
* @brief Level of command buffer
*/
void Texture::Create(Graphics::TextureUsageFlags usage)
{
- CreateWithData(usage, nullptr, 0u);
+ Create(usage, Graphics::TextureAllocationPolicy::CREATION);
}
-void Texture::CreateWithData(Graphics::TextureUsageFlags usage, uint8_t* data, uint32_t size)
+void Texture::Create(Graphics::TextureUsageFlags usage, Graphics::TextureAllocationPolicy allocationPolicy)
+{
+ CreateWithData(usage, allocationPolicy, nullptr, 0u);
+}
+
+void Texture::CreateWithData(Graphics::TextureUsageFlags usage, Graphics::TextureAllocationPolicy allocationPolicy, uint8_t* data, uint32_t size)
{
auto createInfo = Graphics::TextureCreateInfo();
createInfo
.SetFormat(ConvertPixelFormat(mPixelFormat))
.SetSize({mWidth, mHeight})
.SetLayout(Graphics::TextureLayout::LINEAR)
+ .SetAllocationPolicy(allocationPolicy)
.SetData(data)
.SetDataSize(size)
.SetNativeImage(mNativeImage)
// Always create new graphics texture object if we use uploaded parameter as texture.
if(!mGraphicsTexture || mUseUploadedParameter)
{
- Create(static_cast<Graphics::TextureUsageFlags>(Graphics::TextureUsageFlagBits::SAMPLE));
+ const bool isSubImage(params.xOffset != 0u || params.yOffset != 0u ||
+ uploadedDataWidth != (mWidth >> params.mipmap) ||
+ uploadedDataHeight != (mHeight >> params.mipmap));
+ Create(static_cast<Graphics::TextureUsageFlags>(Graphics::TextureUsageFlagBits::SAMPLE), isSubImage ? Graphics::TextureAllocationPolicy::CREATION : Graphics::TextureAllocationPolicy::UPLOAD);
}
Graphics::TextureUpdateInfo info{};
*/
void ApplySampler(Render::Sampler* sampler);
+ /**
+ * Create the texture without a buffer
+ * @param[in] usage How texture will be used
+ * @param[in] allocationPolicy Policy of texture allocation
+ */
+ void Create(Graphics::TextureUsageFlags usage, Graphics::TextureAllocationPolicy allocationPolicy);
+
/**
* Create a texture with a buffer if non-null
* @param[in] usage How texture will be used
+ * @param[in] allocationPolicy Policy of texture allocation
* @param[in] buffer Buffer to copy
* @param[in] bufferSize Size of buffer to copy
*/
- void CreateWithData(Graphics::TextureUsageFlags usage, uint8_t* buffer, uint32_t bufferSize);
+ void CreateWithData(Graphics::TextureUsageFlags usage, Graphics::TextureAllocationPolicy allocationPolicy, uint8_t* buffer, uint32_t bufferSize);
private:
Graphics::Controller* mGraphicsController;