#define DALI_GRAPHICS_API_TYPES
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 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.
*/
// EXTERNAL INCLUDES
+#include <memory>
#include <string>
#include <utility>
#include <vector>
{
namespace Graphics
{
-class CommandBuffer;
-class Texture;
class Buffer;
-class Shader;
+class CommandBuffer;
class Framebuffer;
+class Program;
+class Shader;
+class Texture;
/**
* @brief Structure describes 2D offset
REVERSE_SUBTRACT = 2,
MIN = 3,
MAX = 4,
+ MULTIPLY = 5,
+ SCREEN = 6,
+ OVERLAY = 7,
+ DARKEN = 8,
+ LIGHTEN = 9,
+ COLOR_DODGE = 10,
+ COLOR_BURN = 11,
+ HARD_LIGHT = 12,
+ SOFT_LIGHT = 13,
+ DIFFERENCE = 14,
+ EXCLUSION = 15,
+ HUE = 16,
+ SATURATION = 17,
+ COLOR = 18,
+ LUMINOSITY = 19,
};
+const BlendOp ADVANCED_BLEND_OPTIONS_START(BlendOp::MULTIPLY);
+
/**
* @brief Compare operators
*/
{
POINT_LIST,
LINE_LIST,
+ LINE_LOOP,
LINE_STRIP,
TRIANGLE_LIST,
TRIANGLE_STRIP,
};
/**
- * @brief Framebuffer state
+ * @brief Program State
+ */
+struct ProgramState
+{
+ const Program* program{nullptr};
+
+ auto& SetProgram(const Program& value)
+ {
+ program = &value;
+ return *this;
+ }
+};
+
+/**
+ * @brief Framebuffer state.
*/
struct FramebufferState
{
R64G64B64A64_UINT,
R64G64B64A64_SINT,
R64G64B64A64_SFLOAT,
+ R11G11B10_UFLOAT_PACK32,
B10G11R11_UFLOAT_PACK32,
E5B9G9R9_UFLOAT_PACK32,
D16_UNORM,
}
/**
+ * @brief Buffer property bits
+ *
+ * Use these bits to set BufferPropertiesFlags.
+ */
+enum class BufferPropertiesFlagBit : uint32_t
+{
+ CPU_ALLOCATED = 1 << 0, ///< Buffer is allocated on the CPU side
+ TRANSIENT_MEMORY = 1 << 1, ///< Buffer memory will be short-lived
+};
+
+/**
+ * @brief BufferPropetiesFlags alters behaviour of implementation
+ */
+using BufferPropertiesFlags = uint32_t;
+
+inline BufferPropertiesFlags operator|(BufferPropertiesFlags flags, BufferPropertiesFlagBit usage)
+{
+ flags |= static_cast<uint32_t>(usage);
+ return flags;
+}
+
+/**
* @brief The structure describes memory requirements of GPU resource (texture, buffer)
*/
struct MemoryRequirements
Extent2D srcExtent2D{};
uint32_t srcOffset{};
uint32_t srcSize{};
+ uint32_t srcStride{};
+ Format srcFormat{}; ///< Should match dstTexture's format, otherwise conversion may occur
};
/**
*/
struct DepthStencilAttachment
{
- // TODO:
+ enum class Usage
+ {
+ WRITE, // If no texture, will create a RenderBuffer instead
+ NONE // If no attachment/RenderBuffer required
+ };
+ Texture* depthTexture{nullptr};
+ Texture* stencilTexture{nullptr};
+ uint32_t depthLevel{0};
+ uint32_t stencilLevel{0};
+ Usage depthUsage{Usage::NONE};
+ Usage stencilUsage{Usage::NONE};
};
/**
};
/**
+ * @brief Uniform class
+ */
+enum class UniformClass
+{
+ SAMPLER,
+ IMAGE,
+ COMBINED_IMAGE_SAMPLER,
+ UNIFORM_BUFFER,
+ UNIFORM,
+ UNDEFINED
+};
+
+/**
* @brief Type of texture
*/
enum class TextureType
};
/**
+ * @brief The information of the uniform
+ */
+struct UniformInfo
+{
+ std::string name{""};
+ UniformClass uniformClass{UniformClass::UNDEFINED};
+ uint32_t binding{0u};
+ uint32_t bufferIndex{0u};
+ uint32_t offset{0u};
+ uint32_t location{0u};
+
+ bool operator==(const UniformInfo& rhs)
+ {
+ return name == rhs.name &&
+ uniformClass == rhs.uniformClass &&
+ binding == rhs.binding &&
+ bufferIndex == rhs.bufferIndex &&
+ offset == rhs.offset &&
+ location == rhs.location;
+ }
+};
+
+/**
+ * @brief The information of the uniform block
+ */
+struct UniformBlockInfo
+{
+ std::string name{""};
+ uint32_t descriptorSet{0u};
+ uint32_t binding{0u};
+ uint32_t size{0u};
+ std::vector<UniformInfo> members{};
+};
+
+/**
* @brief Describes pipeline's shading stages
*
* Shader state binds shader and pipeline stage that the
BUFFER_CREATE_INFO_STRUCT,
COMMAND_BUFFER_CREATE_INFO_STRUCT,
FRAMEBUFFER_CREATE_INFO_STRUCT,
+ PROGRAM_CREATE_INFO_STRUCT,
PIPELINE_CREATE_INFO_STRUCT,
RENDERPASS_CREATE_INFO_STRUCT,
SAMPLER_CREATE_INFO_STRUCT,
SHADER_CREATE_INFO_STRUCT,
TEXTURE_CREATE_INFO_STRUCT,
- RENDER_TARGET_CREATE_INFO_STRUCT
+ RENDER_TARGET_CREATE_INFO_STRUCT,
+ SYNC_OBJECT_CREATE_INFO_STRUCT
+};
+
+/**
+ * @brief Enum describes load operation associated
+ * with particular framebuffer attachment
+ */
+enum class AttachmentLoadOp
+{
+ LOAD, ///< Load previous content
+ CLEAR, ///< Clear the attachment
+ DONT_CARE ///< Let driver decide
+};
+
+/**
+ * @brief Enum describes store operation associated
+ * with particular framebuffer attachment
+ */
+enum class AttachmentStoreOp
+{
+ STORE, ///< Store content (color attachemnts)
+ DONT_CARE ///< Let driver decide (depth/stencil attachemnt with no intention of reading)
+};
+
+/**
+ * @brief The structure describes the read/write
+ * modes of a single framebuffer attachment
+ *
+ * The attachment description specifies what is going to
+ * happen to the attachment at the beginning and end of the
+ * render pass.
+ *
+ * The stencil operation is separated as it may be set
+ * independent from the depth component (use loadOp, storeOp
+ * to set up the depth component and stencilLoadOp, stencilStoreOp
+ * for stencil component).
+ */
+struct AttachmentDescription
+{
+ /**
+ * @brief Sets load operation for the attachment
+ *
+ * @param value Load operation
+ * @return this structure
+ */
+ auto& SetLoadOp(AttachmentLoadOp value)
+ {
+ loadOp = value;
+ return *this;
+ }
+
+ /**
+ * @brief Sets store operation for the attachment
+ *
+ * @param value Store operation
+ * @return this structure
+ */
+ auto& SetStoreOp(AttachmentStoreOp value)
+ {
+ storeOp = value;
+ return *this;
+ }
+
+ /**
+ * @brief Sets load operation for the stencil part of attachment
+ *
+ * @param value load operation
+ * @return this structure
+ */
+ auto& SetStencilLoadOp(AttachmentLoadOp value)
+ {
+ stencilLoadOp = value;
+ return *this;
+ }
+
+ /**
+ * @brief Sets store operation for the stencil part of attachment
+ *
+ * @param value store operation
+ * @return this structure
+ */
+ auto& SetStencilStoreOp(AttachmentStoreOp value)
+ {
+ stencilStoreOp = value;
+ return *this;
+ }
+
+ AttachmentLoadOp loadOp{};
+ AttachmentStoreOp storeOp{};
+ AttachmentLoadOp stencilLoadOp{};
+ AttachmentStoreOp stencilStoreOp{};
};
/**
ExtensionCreateInfo* nextExtension{};
};
+/**
+ * @brief Default deleter for graphics unique pointers
+ *
+ * Returned unique_ptr may require custom deleter. To get it working
+ * with std::unique_ptr the custom type is used with polymorphic deleter
+ */
+template<class T>
+struct DefaultDeleter
+{
+ DefaultDeleter() = default;
+
+ /**
+ * @brief Conversion constructor
+ *
+ * This constructor will set the lambda for type passed
+ * as an argument.
+ */
+ template<class P, template<typename> typename U>
+ DefaultDeleter(const U<P>& deleter)
+ {
+ deleteFunction = [](T* object) { U<P>()(static_cast<P*>(object)); };
+ }
+
+ /**
+ * @brief Conversion constructor from DefaultDelete<P>
+ *
+ * This constructor transfers deleteFunction only
+ */
+ template<class P>
+ explicit DefaultDeleter(const DefaultDeleter<P>& deleter)
+ {
+ deleteFunction = decltype(deleteFunction)(deleter.deleteFunction);
+ }
+
+ /**
+ * @brief Default deleter
+ *
+ * Default deleter will use standard 'delete' call in order
+ * to discard graphics objects unless a custom deleter was
+ * used.
+ *
+ * @param[in] object Object to delete
+ */
+ void operator()(T* object)
+ {
+ if(deleteFunction)
+ {
+ deleteFunction(object);
+ }
+ else
+ {
+ delete object;
+ }
+ }
+
+ void (*deleteFunction)(T* object){nullptr}; ///< Custom delete function
+};
+
+/**
+ * Surface type is just a void* to any native object.
+ */
+using Surface = void;
+
+/**
+ * @brief Enum describing preTransform of render target
+ */
+enum class RenderTargetTransformFlagBits
+{
+ TRANSFORM_IDENTITY_BIT = 0x00000001,
+ ROTATE_90_BIT = 0x00000002,
+ ROTATE_180_BIT = 0x00000004,
+ ROTATE_270_BIT = 0x00000008,
+ HORIZONTAL_MIRROR_BIT = 0x00000010,
+ HORIZONTAL_MIRROR_ROTATE_90_BIT = 0x00000020,
+ HORIZONTAL_MIRROR_ROTATE_180_BIT = 0x00000040,
+ HORIZONTAL_MIRROR_ROTATE_270_BIT = 0x00000080,
+};
+
+using RenderTargetTransformFlags = uint32_t;
+
+template<typename T>
+inline RenderTargetTransformFlags operator|(T flags, RenderTargetTransformFlagBits bit)
+{
+ return static_cast<RenderTargetTransformFlags>(flags) | static_cast<RenderTargetTransformFlags>(bit);
+}
+
+/**
+ * unique_ptr defined in the Graphics scope
+ */
+template<class T, class D = DefaultDeleter<T>>
+using UniquePtr = std::unique_ptr<T, D>;
+
+/**
+ * @brief MakeUnique<> version that returns Graphics::UniquePtr
+ * @param[in] args Arguments for construction
+ * @return
+ */
+template<class T, class Deleter = DefaultDeleter<T>, class... Args>
+std::enable_if_t<!std::is_array<T>::value, Graphics::UniquePtr<T>>
+MakeUnique(Args&&... args)
+{
+ return UniquePtr<T>(new T(std::forward<Args>(args)...), Deleter());
+}
+
} // namespace Graphics
} // namespace Dali